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.上三角矩阵