目录
一、栈在括号匹配中的应用
假设表达式中允许包含两个括号:圆括号和方括号,其嵌套顺序任意,即([]())或[([][])]等均为正确格式,[(])或([())或(()]均为不正确的格式
考虑下列括号序列:
[ ( [ ] [ ] ) ]
1 2 3 4 5 6 7 8
算法分析如下:
- 初始设置一个空栈,顺序读入括号
- 若是右括号,则或者使置于栈顶的最急迫期待得以消解,或者是不合法的情况(括号序列不匹配,退出程序)
- 若是左括号,则作为一个新的更急迫的期待压入栈中,自然使原有栈中的所有未消解的期待的急迫性降低了一级
- 算法结束时,栈为空,否则括号序列不匹配
二、栈在表达式中的应用
(一)计算后缀表达式的值
ABCD-*+EF/-,算法描述如下:
- 顺序扫描表达式中的每一项
- 根据每一项的类型做出相应操作,如果是操作数则压入栈中,如果是操作符,则弹出栈中的两个操作数并把计算完成后的数重新压入栈中
- 当表达式所有项都扫描并处理完后,栈顶存放的就是最后的计算结果
转完就E/F-(A+B*(C-D))
(二)中缀表达式转后缀表达式
中缀表达式a+b-a*((c+d)/e-f)+g转换为后缀表达式ab+acd+e/f-*-g+算法描述如下:
- 从左向右扫描中缀表达式
- 遇到数字时,加入后缀表达式
- 遇到符号时
①若为'(',入栈
②若为')',则依次把栈中运算符加入后缀表达式,直到出现'(',从栈中删除'('
③若为其他运算符,当其优先级高于栈顶运算符时,直接入栈;否则从栈顶开始依次弹出比当前处理运算符优先级高和优先级相当的运算符,直到一个比它优先级低或者遇到了一个左括号位置
三、栈在递归中的应用
递归是一种程序设计方法。若在一个函数、过程或数据结构的定义中又应用到了它本身,则这个函数、过程或数据结构成为是递归定义的,简称递归
通常把大型的复杂问题转化为一个与原问题相似的规模较小的问题来求解,大大减少程序代码量,但在通常情况下,效率并不太高
以斐波拉契数为例,其定义为
代码实现如下:
int Fib(int n)
{
if(n==0)
return 0; //边界条件
else if (n==1);
return 1; //边界条件
else
return Fib(n-1)+Fib(n-2); //递归表达式
}
四、队列在层次遍历中的应用
算法思想是根节点出子节点进
五、队列在计算机系统中的应用
(一)解决主机与外部设备之间不匹配的问题
主机输出数据给打印机打印,输出数据的速度比打印数据的速度要快得多,由于速度不匹配,直接把数据送给打印机显然不行
解决办法:
设置一个打印数据缓冲区,主机把要打印输出的数据依次写入这个缓冲区,写满后就暂停输出,转去做其他事情,打印机就从缓冲区中按先进先出顺序依次取出数据打印
(二)CPU资源的竞争
在一个带有多终端的计算机系统上,有多个用户需要CPU各自运行自己的程序,它们分别通过各自的终端向操作系统提出占用CPU的请求。
操作系统通常按照每个请求在时间上的先后顺序,把它们排成一个队列,每次把CPU分配给队首请求的用户使用