- 栈在括号匹配中的应用
- 栈在表达式求值中的应用
- 栈在递归中的应用
- 队列的应用
栈在括号匹配中的应用
最后出现的左括号最先被匹配(LIFO)
【用栈的特性实现】
1:压入左括号,遇到右括号将栈中的左括号弹出
对括号进行配对检查。
2:无论是栈中括号不足,还是栈中剩余括号,都表明匹配失败。
匹配失败的情况:左括号单/右括号单/左右括号不匹配
栈在表达式求值的应用
考点如下:
1:三种算术表达式:中缀/后缀/前缀
2:后缀表达式相关考点:中缀表达式转后缀表达式/后缀表达式求值
3:前缀表达式相关考点:中缀表达式转前缀表达式/前缀表达式求值
算术表达式
由三个部分组成:操作数、运算符、界限符【必不可少,反映了运算先后次序】
- 逆波兰式(后缀表达式):运算符在两个操作数后面
实现思路:遇到操作数就入栈,遇到运算符就出栈两个数据,后出的元素位于运算符的左边,先出的位于运算符的右边,进行运算,将运算后的结果再压入栈中,重复该过程直到表达式全部输入。
就得到了中缀表达式转后缀表达式。
【中缀转后缀:遵循左优先的原则】
2:中缀转化成前缀【遵循右优先的原则】
实现思路:就是上方思路从右侧进行一样的操作。
【机算算法实现】——【中缀转后缀】+【后缀表达式求值】
栈在递归中的应用
函数调用的特点:最后被调用的函数是最先执行结束的(LIFO)
联系编译原理所学的内容
例子:
适合用递归算法解决,可以把原始问题转换为属性相同,但规模较小的问题
缺点:递归层数太多可能会导致栈溢出
递归层数太多,时间复杂度也会升高
引入:递归算法和非递归算法的区别?
答:递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
缺点:递归可能包含多次重复运算
队列的应用
【树的层次遍历】
【图的广度优先遍历】
【多个进程争抢着使用有限的系统资源时,FCFS是一种常用的策略】
队列在计算机系统中的应用
1:解决主机与外部设备之间速度不匹配的问题
【打印机和主机之间速度不匹配】
【主机输出数据给打印机打印,输出数据的速度比打印数据的速度要快得多,由于速度不匹配,若直接把输出的数据送给打印机打印是显然不行的。】
【解决方案:设置一个打印数据缓冲区,主机要把打印的数据依次写入这个缓冲区,写满后就暂停输出,转去做其他的事情,打印机就从缓冲区中按照先进先出的原则依次取出数据并打印,打印完后再向主机发送请求,主机接收到请求后再次向缓冲区中打印数据,保证了打印数据的正确又提高了效率】
【打印数据缓冲区所存储的数据就是一个队列】
2:解决由多用户引起的资源竞争问题
【cpu的资源竞争】