写在最前
简单介绍栈和队列的一些常见应用
一、栈与括号匹配
首先,在表达式中,括号分为 ( ) 和 [ ] 以及 { } 。
思想:
- 初始一个空栈,顺序(这里指从左往右)读入括号
- 遇到左括号,入栈
- 遇到右括号,就将栈顶左括号出栈进行匹配
失败原因:
- 左括号数为单数
- 右括号数为单数
- 左右括号不匹配
括号都是成对出现的,单身的括号肯定是没人要的,可以这么去理解。
逻辑代码如下:
bool bracketCheck(char str[],int length)
{
SqStack S;
InitStack(S);
for(int i=0; i<length; i++)
{
if(str[i]=='(' || str[i]=='[' || str[i]=='{')
{
Push(S,str[i]);
}
else
{
if(StackEmpty(S))
return false;
char topElem;
Pop(S,topElem);
if(str[i]==')' && topElem!='(')
return false;
if(str[i]==']' && topElem!='[')
return false;
if(str[i]=='}' && topElem!='{')
return false;
}
}
return StackEmpty(S); //检索完全部括号,栈空说明匹配成功
}
二、栈与表达式求值
首先,表达式可以分为前缀、后缀、中缀(生活中常用的)表达式三种。
这里以后缀为例介绍计算过程:
顺序(后缀为从左到右,前缀为从右往左) 扫描表达式中每一项,若为操作数,则压入栈中;若为运算符,则连续从栈中推出两个操作数,计算其结果并压入栈中。当所有项扫描完毕,栈顶存放的为最后结果。
注 意 : \color{red}注意: 注意:这里先弹出的操作数为右操作数
三、栈与递归
我们用下图举一个简单的例子
这里再复习下递归的两个条件:递归表达式和递归出口。
四、队列与遍历
4.1树的层次遍历
思想:
- 根结点入队
- 若队空,则遍历结束;否则重复3
- 队中第一个结点出队,并访问该结点;若有左孩子,则左孩子入队;若有右孩子,则将右孩子入队,返回2
eg:
4.2图的广度优先遍历
图示中相同颜色的为一层
队列的遍历顺序为1->2>3->4->5->6->7->8
五、队列与计算机系统
- 解决主机与外设之间速度不匹配的问题,如主机和打印机,可以设置一个数据缓冲区
- 解决多用户引起的资源竞争问题,把多用户按照请求时间的先后顺序排成一个队列
写在最后
付出,就有收获!