参考:https://blog.youkuaiyun.com/jiaoyangwm/article/details/80808235
https://blog.youkuaiyun.com/a2392008643/article/details/81781766
https://mp.weixin.qq.com/s/vn3KiV-ez79FmbZ36SX9lg
本文仅是将他人博客经个人理解转化为简明的知识点,供各位博友快速理解记忆,并非纯原创博客,如需了解详细知识点,请查看参考的各个原创博客。
目录
第四章 栈、队列和堆
- 栈是限定仅在表尾进行插入和删除操作的线性表
- 队列是只允许在一端进行插入操作、而在另一端进行删除操作的线性表
- 堆(Heap)是计算机科学中一类特殊的数据结构的统称,其通常是一个可以被看做一棵完全二叉树的数组对象。
4.1 栈的定义
栈是一种后进先出的线性表(LIFO),栈顶是允许插入和删除的一端,栈底不允许任何操作。其包含的操作有:进栈和出栈。

4.2 队列的定义
队列是一种先进先出的线性表的线性表(FIFO),队头是允许删除的一端,队尾是允许插入的一端。

双向队列
双向队列,顾名思义就是队列头尾均可以操作的队列,它允许在容器头部快速插入和删除,C++中使用deque来表示。
优先队列
优先队列中,元素被赋予优先级,当删除元素时,具有最高优先级的元素最先删除,即具有最高级先出 (First In, Largest Out)的特点。
//升序队列,小顶堆
priority_queue <int,vector<int>,greater<int>> q;
//降序队列,大顶堆
priority_queue<int> a; //写法一
priority_queue <int,vector<int>,less<int>>q; //写法二
4.3 堆的定义
堆是一棵具有特定性质的完全二叉树,它满足堆中所有结点大于等于(或小于等于)其孩子结点的基本特性。

4.4 相关面试题
Q:栈的溢出
A:栈溢出是指程序向栈中某个变量写入的字节数超过了这个变量本身所申请的字节数,因而导致栈中与其相邻的变量的值被改变。
原因:
1)局部数组过大。局部变量是存储在栈中的,当函数内部的数组过大时,有可能导致堆栈溢出。
2)递归调用层次太多。递归函数在运行时会执行压栈操作,当压栈次数太多时,也会导致堆栈溢出。
3)指针或数组越界。
Q:堆和栈的区别
A:
1)申请方式:栈由系统自动分配和管理,堆由程序员手动分配和管理。
2)效率:栈由系统分配,计算机底层对栈提供了一系列支持:分配专门的寄存器存储栈的地址,压栈和入栈有专门的指令执行,因此,其速度快,不会有内存碎片;堆由程序员分配,堆是由C/C++函数库提供的,机制复杂,需要一些列分配内存、合并内存和释放内存的算法,因此效率较低,可能由于操作不当产生内存碎片。
3)扩展方向:栈从高地址向低地址进行扩展,堆由低地址向高地址进行扩展。
4)程序局部变量是使用的栈空间,new/malloc动态申请的内存是堆空间;同时,函数调用时会进行形参和返回值的压栈出栈,也是用的栈空间。
第五章 串
- 串是由零个或多个字符组成的有限序列,又称字符串。
串这个数据结构本身没什么好讲的,而关于串的算法面试题很多,参见:https://github.com/CyC2018/CS-Notes/blob/master/notes/Leetcode%20%E9%A2%98%E8%A7%A3%20-%20%E5%AD%97%E7%AC%A6%E4%B8%B2.md