栈的应用
栈在括号匹配中的应用
- 问题描述:左右括号匹配
- 算法设计:遇到
左括号
就进行入栈
操作,遇到右括号
,就消耗
掉左括号
进行弹出栈顶元素操作 匹配失败
情况:
1.左括号无匹配
2.右括号无匹配
3.左右括号不匹配
栈在表达式求值中的应用
中缀:a+b
前缀:+ab
后缀:ab+
1.从左往右扫描下一个元素,直到处理完所有元素
2.若扫描到操作数则压入栈,返回1;否则执行3
3.若扫描到运算符,则弹出两个栈顶元素,执行相应运算,把运算结果压回栈顶。返回1
栈在递归中的应用
- 递归:函数自己调用自己的过程
- 递归中函数调用的特点:最后被调用的函数最先执行结束(
后进先出LIFO
) - 适合“递归算法”的问题:把原始问题转换为属性相同,但规模较小的问题:
ex1:计算正整数的阶乘:n*factorial(n-1)
ex2:求斐波那契数列:Fib(n-1)+Fib(n-2)
- 递归算法解决思路:求出递归表达式,找到边界条件
- 缺点:太多层递归可能导致栈溢出,空间复杂度高
队列的应用
从根结点出发,把每一个父结点的左右子结点放入队列的队尾,弹出队头元素
操作系统资源分配:FCFS(First Come First Service,先来先服务),可用队列的先进先出(FIFO)结构实现。比如将队头进程分配给CPU
打印数据缓冲区:多人使用一台打印机,系统缓冲区(用“队列”组织打印数据),打印机每次回先打印队头文件