第三讲 栈与队列
理解!理解!理解!
记得看清楚 题目条件
1. 栈和队列的基本概念
2. 栈和队列的顺序存储结构
lj 理解为主,用猪头打游戏的男人,hhhh
(1) 栈:栈顶元素位置:指向最后一个元素、指向最后一个元素的下一个位置
stk[N]
指向最后一个元素 // top = -1
// 添加
stk[++top] = 1;
// 删除
top--;
//栈顶
stk[top]
指向最后一个元素的下一个位置 // top = 0;
// 添加
stk[top++] = 1;
// 删除
top--;
// 返回栈顶
stk[top-1]
// 判断是否为空
top == 0 // top==初始值
(2) 队列:一般采用 循环队列 。
(a) 队头元素位置:指向第一个元素、指向第一个元素的前一个位置。
(b) 队尾元素位置:指向队尾元素、指向队尾元素的下一个位置。
p[N]
// front rear
1.front=0 第一个元素,rear=0 最后一个元素的下一个元素
// 判空
front == rear
// 队满
front = (rear+1)%N
// 插入
q[rear++] = 1;
rear %= N
// 弹出
front = (front + 1 )%N;
// 弹出队头
q[front]
2.front 第一个元素,rear=-1 最后一个元素
// 判空
front == (rear+1)%N;
// 队满
front = (rear+2)%N
// 插入
q[++rear] = 1;
rear %= N
// 弹出
front = (front + 1 )%N;
// 弹出队头
q[front]
3. 栈和队列的链式存储结构
栈
头插 和 头删
top指向第一个元素
队列
front 第一个元素
rear 最后一个元素的下一个元素
4. 栈和队列的应用
(1) 栈的应用:表达式求值(中缀表达式转后缀表达式、括号匹配)、DFS
DFS // 套娃?? 画树图来理解 计算机用栈来维护 深搜
不撞南墙不回头
表达式求值(中缀表达式转后缀表达式、括号匹配)
重要!!!!!! 必考。
理解背,模板题
AcWing 3302. 表达式求值
笔试要求:
过程,选择题经常考
往年并没考大题,今年可能。
一个栈存符号( +-*/ 加减符号优先级)
一个栈存数字
王道书解法:
王道P91-92 11题
双栈:运算符栈和操作数栈
那么操作符优先级怎么定义呢?
优先级分为栈内优先级(in stack priority)isp 和 栈外优先级(in coming priority)icp
isp[op]表示该操作符op在栈内的优先数, icp[op]表示该操作符op在栈外的优先数,对于isp和icp可以用一个map存储 char 到 int 的映射
ps:a+b-a*((c+d)/e-f)+g:
按照王道书写:
1 |
|
表达式求值,推荐
1 |
|
中缀表达式转后缀表达式:
1 |
|
(2) 队列的应用:BFS
宽搜 层次遍历
5. 考题:2011-2、2011-3、2012-2、2013-2、2014-2、2014-3、2015-1、2016-3、2017-2、2018-1、2018-2、2019-42、2020-2
2011-2
栈: a b c d
d e c b a
d c e b a
d c b e a
d c b a e
4种
2011-3
循环队列
rear 添加一个元素后移一个 当n-1时添加一个元素 才会到 0 A[0]
2012-2
A
2013-2
B
2014-2
B
2014-3
A
2015-1
A
2016-3
C
2017-2
1.尾递归可以不用栈
C
2018-1
B
2018-2
C 模拟即可
队列 Q 123456
栈
队列输出 ,队列输出压栈,栈输出
2019-42
设计一个循环队列 , O(1)时间只能使用链式
但不用代码,只写设计思想即可
front 对头,rear 最后一个下一个元素
(3)画出第一个元素入队后的队列状态。
(4)给出入队操作和出队操作的基本过程。
2020-2