2.8 栈和队列的应用
大约 2 分钟
2.8 栈和队列的应用
2.8.1 栈的应用
栈在括号匹配中的应用
- 初始设置一个空栈,顺序读入括号
- 若是右括号,则或者置于栈顶的最急迫期待得以消解,或者是不合法的情况
- 若是左括号,则作为一个新的更急迫的期待压入栈中
- 算法结束时,栈为空,否则括号序列不匹配
表达式求值(中缀表达式求值)
三种表达式:中缀表达式
、后缀表达式
、前缀表达式
中缀表达式:有界限符
后缀和前缀表达式:无界限符
注
:方法一和方法二都是分开的,分为两步
方法一:中缀表达式转后缀表达式,再用后缀表达式求值
- 中缀表达式转后缀表达式(用
栈
保存运算符
)
中缀表达式
从左往右
扫描:①遇到
操作数
,直接压入栈。②遇到
界限符
,遇到“(”,直接压入栈;遇到“)”,依次弹出栈内运算符从左往右
加入表达式,直到弹出“(”结束。③遇到
运算符
,依次弹出比这个运算符优先级高的所有运算符,将此运算符压入栈。
- 后缀表达式求值(用
栈
存运算结果
)
后缀表达式
从左往右
扫描:①遇到
操作数
,直接压入栈。②遇到
运算符
,弹出两个元素,执行相应运算,将运算结果压回栈顶
方法二:中缀表达式转前缀表达式,再用前缀表达式求值
- 中缀表达式转前缀表达式(用
栈
保存运算符
)
中缀表达式
从右往左
扫描:①遇到
操作数
,直接压入栈。②遇到
界限符
,遇到“(”,直接压入栈;遇到“)”,依次弹出栈内运算符从右往左
加入表达式,直到弹出“(”结束。③遇到
运算符
,依次弹出比这个运算符优先级高的所有运算符,将此运算符压入栈。
- 前缀表达式求值(用
栈
存运算结果
)
前缀表达式
从右往左
扫描:①遇到
操作数
,直接压入栈。②遇到
运算符
,弹出两个元素,执行相应运算,将运算结果压回栈顶
递归
可以将递归算法转换为非递归算法。通常需要借助栈来实现这种转换
2.8.2 队列的应用
树的层次遍历
图的广度优先遍历
操作系统中的应用
多个进程争抢有限的系统资源时,采用
先来先服务算法(FCFS)
例子:CPU资源分配;打印数据缓冲区