第三章 栈与队列
(一) 栈
1 栈的结构与定义
栈(Stack):只允许在一端进行插入或删除操作的线性表。
栈顶(Top):线性表允许进行插入和删除的那一端。
栈底(Bottom):固定的,不允许进行插入和删除的另一端
Tips
1.栈是受限的线性表,所以自然具有线性关系。
2.栈中元素后进去的必然先出来,即后进先出LIFO(Last In First Out)
2 顺序栈
栈是线性表的特例,那栈的顺序存储也是线性表顺序存储的简化。栈的顺序存储结构也叫作顺序栈。
1.Top值不能超过MaxSize
2.空栈的判定条件通常定为top==-1,满栈的判定条件通常为top==MaxSize-1,栈中数据元素个数为top+1
3 共享栈
顺序栈的存储空间大小需要事先开辟好,很多时候对每个栈各自单独开辟存储空间的利用率不如将各个栈的存储空间共享
4 链式栈
栈是线性表的特例,线性表的存储结构还有链式存储结构,所以也可以用链表的方式来实现栈。栈的链式存储结构也叫作链栈。
(二) 队列
1 队列的定义
队列是只允许在一端进行插入,而在另一端进行删除的线性表
2 队列的结构
队头(Front):允许删除的一端,又称为队首。
队尾(Rear):允许插入的一端。
先进入队列的元素必然先离开队列,即先进先出(First In First Out)简称FIFO
3 顺序队列
用数组来实现队列,可以将队首放在数组下标为0的位置。
4 循环队列
把数组“掰弯”,形成一个环。Rear指针到了下标为4的位置还能继续指回到下标为0的地方。这样首尾相连的顺序存储的队列就叫循环队列
方法一
设置标志位flag,当flag=0且rear等于front时为队列空,当flag=1且rear等于front时为队列满。
方法二
把front=rear仅作为队空的判定条件。当队列满的时候,令数组中仍然保留一个空余单元。我们认为这种情况就是队列满了。
5 链式队列
队列的链式存储结构,其实就是线性表的单链表,只不过需要加点限制,只能表尾插入元素,表头删除元素。
分别设置队头指针和队尾指针,队头指针指向头结点,队尾指针指向尾结点。
6 双端队列
双端队列是指允许两端都可以进行入队和出队操作的队列
(三) 栈的应用
1 括号匹配
假设有两种括号,一种圆的(),一种方的[],嵌套的顺序是任意的。
算法思想
若是左括号,入栈;若是右括号,出栈一个左括号判断是否与之匹配;检验到字符串尾,还要检查栈是否为空。只有栈空,整个字符串才是括号匹配的。
2 表达式求值
规则:从左到右扫描表达式的每个数字和符号,遇到数字就进栈,遇到符号就将处于栈顶的两个数字出栈然后跟这个符号进行运算,最后将运算结果进栈,直到最终获得结果。
1.按运算符优先级对所有运算符和它的运算数加括号。(原本的括号不用加)
2.把运算符移到对应的括号后。
3.去掉括号。
3 递归
要理解递归,你要先理解递归,直到你能理解递归。
如果在一个函数、过程或数据结构的定义中又应用了它自身,那么这个函数、过程或数据结构称为是递归定义的,简称递归。递归最重要的是递归式和递归边界。