- 该合辑为笔者自b站自学的“C++数据结构与算法”课程学习记录,旨在将重要的学习要点、思考内容与部分代码进行记录,以便后续自行翻看,亦可给其他读者带来一些参考
- 内容基于笔者自身的理解或感悟,可能存在不妥当或是错误之处
- 系统环境:Win10,Visual Studio 2019
- 图片参考东北大学“数据结构与算法设计”(2020)线上课程讲义
目录
1 栈
一种“受限制”的线性数据结构,遵循“先进后出”规则,常用的有IsEmpty, IsFull, top, Push, Pop, displaystack 等指令
Array实现
较下方的链表实现更为常用,综合性能均衡
双向栈
结构较为复杂,为计算机初期为了节省内存的设计,现在应用较少
Linked list实现
也称为链栈,通常设计链尾是栈底,否则在删除操作时要花费O(n),大量移动元素的操作会消耗性能,一般采用不带头结点的单链表,其存在对动态内存调度的消耗较高的缺点,因此相较于数组栈不那么常用
STL中的栈
记得头文件添加:
#include <stack>
其为基于deque的一个适配器类,改变其基础类的调用接口,要注意pop操作无返回值,无法得知被删除的元素内容,如想得知,需在删除前先进行查询
Applications
可应用于符号匹配(检查编译语法)、表达式运算(Postfix/Infix Expressions)
2 队列
和栈的命运相似,也是一种“受限制”的线性表,其元素遵循“先进先出”规则
在 队尾(rear) 进行 插入(Insert) ,其操作行为称作 (入队列)Enqueue
在 队头(front)进行 删除(delete), 其操作行为称作 (出队列)Dequeue
Array实现
一个较好的方法是利用circular array,其可以避免频繁的增删操作在Array中的性能开销,并且不浪费空间,如下图是较差的方案
出队列时大概要花费0(n),效率非常低
如果采用更好一点儿的方式,以移动队头的方式来起到出队列操作,虽出队列仅需花费O(1),但可能会造成前部分空间的浪费
最终,采用circular array方式,并牺牲一个存储空间来实现区分队列空和满的工能(如不牺牲则无法通过判断front是否等于rear来判断空满,因为空和满时,两指针均重叠),该种方式即避免了频繁删除的移动元素性能开销,又可以起到节省空间的作用
Linked list实现
要记录头尾两个指针来完成插入和删除操作,可以设置一个conter来持续追踪list的size,其相比于Array实现可能更佳
STL中的队列
其为基于双端队列的适配器(adapter)类,记得要:
#include <queue>
The End