王道笔记
- 第三章 栈、队列和数组
- 3.1 栈
- 1.栈的基本概念
- 1)栈的基本操作
- 2)栈的常考题型
- 2.栈的顺序存储实现
- 1)顺序栈的定义
- 2)初始化操作
- 3)进栈操作
- 4)出栈操作
- 5)读栈顶元素操作
- 6)另一种(push、pop、GetTop)方式
- 7)共享栈
- 3.栈的链式存储实现
- 1)进栈
- 2)出栈
- 3)链栈的定义
- 3.2 队列
- 1.队列的基本概念
- 1)队列的操作
- 2.队列的顺序实现
- 1)队列的顺序实现
- 2)队列的初始化
- 3)入队操作
- 4)循环队列
- 5)循环队列——入队操作
- 6)循环队列——出队操作
- 7)判断队列已满/已空
- 3.队列的链式实现
- 1)队列的链式实现
- 2)初始化
- 带头结点
- 不带头结点
- 3)入队
- 带头结点
- 不带头结点
- 4)出队
- 5)队列满的条件
- 4.双端队列
- 1)定义
- 3.3 栈和队列的应用
- 1.栈在括号匹配中的应用
- 1)算法演示
- 2)流程图演示
- 3)代码实现
- 2.栈在表达式求值中的应用(上)
- 1)算数表达式
- 2)中缀、后缀、前缀表达式
- 3)中缀表达式转后缀表达式(手算)
- 4)后缀表达式的计算(手算)
- 5)后缀表达式的计算(机算)
- 6)中缀表达式转前缀表达式
- 7)前缀表达式的计算
- 3. 栈在表达式求值中的应用(下)
- 1)中缀表达式转后缀表达式(手算)
- 2)后缀表达式的计算(机算)
- 3)中缀表达式的计算(用栈实现)
- 4.栈在递归中的应用
- 1)函数调用的背后
- 2)栈在递归中的应用
- 5. 队列的应用
- 1)树的层次遍历
- 2)图的广度优先遍历
- 3)队列在操作系统中的应用
- 3.4 特殊矩阵的压缩存储
- 1.一维数组的存储结构
- 2.二维数组的存储结构
- 3.普通矩阵的存储
- 4.对称矩阵的压缩存储
- 1)行优先
- 2)列优先
- 5.三角矩阵的压缩方式
- 1)下三角矩阵
- 2)上三角矩阵
- 3)三对角矩阵又称带状矩阵
- 4)稀疏矩阵的压缩存储
第三章 栈、队列和数组
3.1 栈
1.栈的基本概念
-
栈(Stack)是只允许在一端进行插入或删除操作的线性表
-
一种操作受限的线性表,只能在栈顶插入、删除。
-
特性:先进后出(LIFO)(Last In First Out)
1)栈的基本操作
- 只能在栈顶操作
2)栈的常考题型
2.栈的顺序存储实现
1)顺序栈的定义
2)初始化操作
3)进栈操作
4)出栈操作
5)读栈顶元素操作
- 和出栈的唯一区别就是,top不需要–
6)另一种(push、pop、GetTop)方式
进栈和出栈
7)共享栈
3.栈的链式存储实现
- 链头=栈顶,对链头进行操作
1)进栈
2)出栈
3)链栈的定义
3.2 队列
1.队列的基本概念
- 队列(Queue)是只允许在一端进行插入,在另一端删除的线性表
- 重要术语:队头、队尾、空队列
- 队列的特点:先进先出(FIFO)(First In First Out)
1)队列的操作
2.队列的顺序实现
1)队列的顺序实现
2)队列的初始化
3)入队操作
4)循环队列
5)循环队列——入队操作
6)循环队列——出队操作
7)判断队列已满/已空
- 指向队尾元素的下一个元素
方案一:
(Q.rear+1)%MaxSize==Q.front
方案二:定义一个size
size==MaxSize
方案三:定义一个tag
front == rear && tag == 1
- 指向队尾元素的代码
判空:
判满:
![](https://i-blog.csdnimg.cn/blog_migrate/d02b1efc9d35e2425a1180997ae51bb6.png)
3.队列的链式实现
1)队列的链式实现
2)初始化
3)入队
4)出队
- 带头结点
- 不带头结点
5)队列满的条件
4.双端队列
1)定义
注:栈中合法的序列,双端队列中也一定合法
3.3 栈和队列的应用
1.栈在括号匹配中的应用
1)算法演示
2)流程图演示
3)代码实现
2.栈在表达式求值中的应用(上)
计算时:后缀表达式先弹出的元素是“右操作数”
计算时:前缀表达式先弹出的元素是“左操作数”
1)算数表达式
由三部分组成:操作数、运算符、界限符(界限符也就是“( )”,界限符反应了计算机的先后顺序)
逆波兰表达式 = 后缀表达式;波兰表达式 = 前缀表达式
2)中缀、后缀、前缀表达式
3)中缀表达式转后缀表达式(手算)
“左优先”原则:只要左边的运算符能先计算,就优先算左边的(可保证运算顺序的唯一)
4)后缀表达式的计算(手算)
特点:最后出现的操作数先被运算(栈LIFO:后进先出)
5)后缀表达式的计算(机算)
注意:先出栈的是右操作数。
6)中缀表达式转前缀表达式
中缀转前缀“右优先”
7)前缀表达式的计算
注意:先出栈的是左操作数。
3. 栈在表达式求值中的应用(下)
1)中缀表达式转后缀表达式(手算)
2)后缀表达式的计算(机算)
此时的栈用来存放还不能确认运算次序的运算符
注意:*/ 优先级高于 ±
3)中缀表达式的计算(用栈实现)
此时的栈用来存放还不能确认运算次序的操作数
4.栈在递归中的应用
1)函数调用的背后
2)栈在递归中的应用
递归算法求阶乘
缺点:太多递归层可能导致栈溢出。因为系统开辟的栈是有限的。
再次思考递归带来的空间复杂度:递归层数越多,空间复杂度越高。
递归算法求斐波那契数
5. 队列的应用
1)树的层次遍历
注:左右节点进队之后根节点,方可出。
2)图的广度优先遍历
3)队列在操作系统中的应用
3.4 特殊矩阵的压缩存储
1.一维数组的存储结构
2.二维数组的存储结构
3.普通矩阵的存储
4.对称矩阵的压缩存储
1)行优先
2)列优先
5.三角矩阵的压缩方式
1)下三角矩阵
2)上三角矩阵
3)三对角矩阵又称带状矩阵
给出数组下标求i,j
4)稀疏矩阵的压缩存储
第一种方法
第二种方法:十字链表法
常见考题