栈
1.定义:
栈(Stack)是只允许仔一段进行插入或删除操作的线性表
逻辑结构与普通线性表相同
栈是后进先出的(LIFO)
2.几个术语
栈顶:允许插入和删除的一端
栈底:不允许插入和删除的一端
3.栈的基本操作:
注意:GetTop只返回栈顶元素的值,Pop则是返回栈顶元素的值并删除他(出栈)
4.常考考题:
已知进栈顺序,判断选项里哪种是合法的栈顺序
(略)
## 顺序栈的实现 **1.定义:** ![](https://daonan233.github.io/post-images/1668135702781.png) 用顺序存储方式实现的栈
声明一个SqStack s, 就会在内存里面分配空间
2.初始化操作:
为什么要把栈顶指针设置为-1?
因为要让栈顶指针指向当前栈顶的位置,而栈空的时候没有元素,不能指在0的位置
3.入栈操作
注意不能写成top++!
当新元素的入栈之前,要让栈顶指针指向要入的位置
4.出栈操作:
注意,这里写的就是top--。因为你要先删除才能指向当前新的栈顶。
(其实数据还残留在内存中,只是逻辑上被删除了)
5.读取栈顶元素:
和pop的唯一区别就是 top指针不变
P.S.当然 也有另外一种写法,就是栈顶指针指向栈顶元素的前一个。
那么就是 top++, --top,要注意审题哦
栈满的时候,top==maxsize
当然呢 也可以使用共享栈来提高空间利用率(略)
链栈
1.定义
队列
1.定义:
是只允许在一端进行插入,在另一端删除的线性表
队列的特点:先进先出(FIFO)
2.重要术语:
队头:允许删除的一端
队尾:允许插入的一端
空队列
3.队列中的基本操作:
## 队列的顺序实现
** 1.队列的定义:**
这里的队尾指针指向队尾元素的后一个位置(下一个应该插入的位置)
2.队列的初始化
3.入队操作在(只能从队尾入队):
啥时候队列已满?:
Q.front = maxsize-1
3.5循环队列:
效果图:
为什么空出来的地方不能再存储?因为这时候 rear指针就会指向front位置,那么就会满足“队列为空“的条件。
而开始的时候(即队列为空的时候),rear指针就是指向front的位置的。
所以循环队列最多能存储的数据个数为maxsize-1个
当然,也可以加一个int size来判断元素个数
或者加一个int tag (删除为0,插入为1),队满的条件为frontrear&&tag1
总结
## 队列的链式实现
1.定义方法
2.初始化:
1.带头结点的
2.不带头结点的
3.入队:
1.(带头结点的)
2.(不带头结点的)
每次操作之后都要让rear指针指向新的表尾结点,第一次入队要改变队头指针指向头结点,后面就不用了
4.出队操作:
1.带头结点的
如果删除的是最后一个结点出队,那就还要让rear指针指向front(还原为空队列)
2.不带头结点的:
5.队列满的条件
(一般不会队满):不关心
6.最后还是注意一个点:
## 双端队列
___
## 栈的应用:括号匹配
**碰到左括号就入栈,遇到右括号,就消耗一个左括号 **
1.若遇到右括号的时候pop出的左括号不匹配时,就匹配失败了!
2.若处理完所有括号后,栈不为空,也匹配失败!
算法实现:
考试中可以直接使用基本操作,但是要简要说明接口是啥(写个注释。
(其实用链栈比较严谨,不会溢出。不过考试用顺序栈更简单)
递归的函数调用栈
特殊矩阵的压缩存储
对称矩阵的压缩存储:
1.行优先原则:
注意,这里的矩阵是从1开始的,而数组从0开始
列优先原则:
三角矩阵的压缩存储:
1.下三角矩阵
2.上三角矩阵