【数据结构】三、栈和队列

时间:2021-05-11 17:43:35

3.1. 栈

定义

​ 只允许在一端进行插入或删除操作的线性表

  • 栈顶:线性表允许进行插入和删除操作的一端
  • 栈底:固定的,不允许进行插入和删除操作的一端
  • 空栈:不含任何元素的空表
  • 后进先出(Last In First Out , LIFO)

基本操作

  • 空栈初始化(InitStack)
  • 判断栈是否为空(StackEmpty)
  • 进栈(Push)
  • 出栈(Pop)
  • 读取栈顶元素(GetTop)
  • 销毁栈(ClearStack)

栈的顺序存储

  • 共享栈:利用栈底位置相对不变的特性,可以让两个顺序栈共享一个一维数据空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸(更有效的利用存储空间)

栈的链式存储

  • 优点:便于多个栈共享存储空间和提高效率,不存在栈满上溢的情况。

3.2. 队列

定义

​ 一种操作受限的线性表,只允许在表的一端进行插入,在表的另一端进行删除。

  • 队头:允许删除的一端,又称队首
  • 队尾:允许插入的一端
  • 空队列:不含任何元素的空表
  • 先进先出(First In First Out , FIFO)

常见操作

  • 初始化队列(InitQueue)
  • 判断队列是否为空(QueueEmpty)
  • 入队(EnQueue)
  • 出队(DeQueue)
  • 读队头元素(GetHead)

队列的顺序存储结构

  • 顺序队列:分配一块连续的存储单元存放队列中的元素,设置队尾指针(rear)和队首指针(front)【容易形成假溢出】
  • 循环队列:把存储队列元素的表视为一个环空间。当队首指针到达最后一个位置时,自动到0【利用%操作】
  • 循环队列的满空判断:(1)牺牲一个单元来区分队空和队满(2)增加一个记录元素个数的数据成员(3)增加一个tag来区分队满还是队空

队列的链式存储

​ 队列的链式表示,一个同时带有队头指针和队尾指针的单链表。

双端队列

​ 允许两端都可以进行入队和出队操作的队列

  • 输出受限的双端队列:允许在一端进行插入和删除,另一端只能插入的双端队列
  • 输入受限的双端队列:允许在一端进行插入和删除,另一端只能删除的双端队列

3.3. 栈和队列的应用

栈用于括号匹配

                [   (   [   ]   [   ]   )   ]
                1   2   3   4   5   6   7   8
  • 1入栈,2入栈,3入栈,4入栈,3和4匹配为一套完整括号,3、4出栈
  • 5入栈,6入栈,5和6匹配为一套完整括号,5、6出栈
  • 7入栈,2和7匹配为一套完整括号,2、7出栈
  • 8入栈,1和8匹配为一套完整括号,1、8出栈
  • 若最后栈中为空,则输入的括号为正确格式

栈用于表达式求值

​ 各个运算符和括号具有优先级,运用后缀表达式的方法来考虑运算优先级

中缀表达式 后缀表达式
A+B*(C-D)-E/F ABCD-*+EF/-

栈在递归中的作用

队列在层次遍历中应用

队列在迷宫寻路中的作用

队列在计算机系统中的作用