线性表-栈和队列的应用(7.18)


写在最前

简单介绍栈和队列的一些常见应用

一、栈与括号匹配

首先,在表达式中,括号分为 ( )[ ] 以及 { }
思想

  1. 初始一个空栈,顺序(这里指从左往右)读入括号
  2. 遇到左括号,入栈
  3. 遇到右括号,就将栈顶左括号出栈进行匹配

失败原因

  • 左括号数为单数
  • 右括号数为单数
  • 左右括号不匹配

括号都是成对出现的,单身的括号肯定是没人要的,可以这么去理解。

逻辑代码如下:

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树的层次遍历

思想

  1. 根结点入队
  2. 若队空,则遍历结束;否则重复3
  3. 队中第一个结点出队,并访问该结点;若有左孩子,则左孩子入队;若有右孩子,则将右孩子入队,返回2

eg:
请添加图片描述

4.2图的广度优先遍历

在这里插入图片描述

图示中相同颜色的为一层
队列的遍历顺序为1->2>3->4->5->6->7->8


五、队列与计算机系统

  1. 解决主机与外设之间速度不匹配的问题,如主机和打印机,可以设置一个数据缓冲区
  2. 解决多用户引起的资源竞争问题,把多用户按照请求时间的先后顺序排成一个队列

写在最后

付出,就有收获!

おすすめ

転載: blog.csdn.net/liangsena/article/details/118970564