[数据结构与算法] 学习记录合辑 (03) 栈与队列

  • 该合辑为笔者自b站自学的“C++数据结构与算法”课程学习记录,旨在将重要的学习要点、思考内容与部分代码进行记录,以便后续自行翻看,亦可给其他读者带来一些参考
  • 内容基于笔者自身的理解或感悟,可能存在不妥当或是错误之处
  • 系统环境:Win10,Visual Studio 2019
  • 图片参考东北大学“数据结构与算法设计”(2020)线上课程讲义

目录

1 栈

Array实现

双向栈

Linked list实现

STL中的栈

Applications

2 队列 

Array实现

Linked list实现

STL中的队列


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 

猜你喜欢

转载自blog.csdn.net/Norths_/article/details/125530441