24考研数据结构-栈和队列的应用

news2024/11/13 22:56:54

目录

    • 3.3.1栈在括号匹配中的应用
      • 流程图
      • 算法代码
    • 3.3.2栈在表达式求值中的应用
      • 1. 中缀表达式 (需要界限符)
      • 2. 后缀表达式 (逆波兰表达式)
        • 中缀表达式转后缀表达式-手算
        • 重点:中缀表达式转后缀表达式-机算
        • 重点:后缀表达式的计算—机算
      • 3.前缀表达式 (波兰表达式)
      • 4.中缀表达式的计算(用栈实现)
      • 5. 知识回顾
    • 3.3.3栈在递归中的应用
      • 调用过程
    • 3.3.4 队列的应用

3.3.1栈在括号匹配中的应用

用栈实现括号匹配

  • ((())) 最后出现的左括号最先被匹配 (栈的特性—LIFO);

  • 遇到左括号就入栈;

  • 遇到右括号,就“消耗”一个左括号 (出栈);

匹配失败情况:

  • 扫描到右括号且栈空,则该右括号单身;

  • 扫描完所有括号后,栈非空,则该左括号单身;

  • 左右括号不匹配;

流程图

在这里插入图片描述

算法代码

#define MaxSize 10   

typedef struct{
    char data[MaxSize];
    int top;
} SqStack;

//初始化栈
InitStack(SqStack &S)

//判断栈是否为空
bool StackEmpty(SqStack &S)

//新元素入栈
bool Push(SqStack &S, char x)

//栈顶元素出栈,用x返回
bool Pop(SqStack &S, char &x)



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;       
        }
    }

    StackEmpty(S);                //栈空说明匹配成功
}



3.3.2栈在表达式求值中的应用

1. 中缀表达式 (需要界限符)

运算符在两个操作数中间:

① a + b
② a + b - c
③ a + b - c*d
④ ((15 ÷ (7-(1+1)))×3)-(2+(1+1))
⑤ A + B × (C - D) - E ÷ F

2. 后缀表达式 (逆波兰表达式)

运算符在两个操作数后面:

① a b +
② ab+ c - / a bc- +
③ ab+ cd* -15 7 1 1 + - ÷ 3 × 2 1 1 + + -
⑤ A B C D - × + E F ÷ - (机算结果)
  A B C D - × E F ÷ - + (不选择)

中缀表达式转后缀表达式-手算

  • 步骤1: 确定中缀表达式中各个运算符的运算顺序

  • 步骤2: 选择下一个运算符,按照[左操作数 右操作数 运算符]的方式组合成一个新的操作数

  • 步骤3: 如果还有运算符没被处理,继续步骤2

“左优先”原则: 只要左边的运算符能先计算,就优先算左边的 (保证运算顺序唯一);

中缀:A + B - C * D / E + F
       ①   ④   ②   ③   ⑤     
后缀:A B + C D * E / - F +

重点:中缀表达式转后缀表达式-机算

初始化一个栈,用于保存暂时还不能确定运算顺序的运算符。从左到右处理各个元素,直到末尾。可能遇到三种情况:

  • 遇到操作数: 直接加入后缀表达式。
  • 遇到界限符: 遇到 ‘(’ 直接入栈; 遇到 ‘)’ 则依次弹出栈内运算符并加入后缀表达式,直到弹出 ‘(’ 为止。注意: ‘(’ 不加入后缀表达式。
  • 遇到运算符: 依次弹出栈中优先级高于或等于当前运算符的所有运算符,并加入后缀表达式,若碰到 ‘(’ 或栈空则停止。之后再把当前运算符入栈。

按上述方法处理完所有字符后,将栈中剩余运算符依次弹出,并加入后缀表达式。

重点:后缀表达式的计算—机算

先出栈的是“右操作数”

3.前缀表达式 (波兰表达式)

运算符在两个操作数前面:

+ a b
② - +ab  c
③ - +ab *cd

中缀表达式转前缀表达式—手算

  • 步骤1: 确定中缀表达式中各个运算符的运算顺序

  • 步骤2: 选择下一个运算符,按照[运算符 左操作数 右操作数]的方式组合成一个新的操作数

  • 步骤3: 如果还有运算符没被处理,就继续执行步骤2

“右优先”原则: 只要右边的运算符能先计算,就优先算右边的;

中缀:A + B * (C - D) - E / F
       ⑤   ③    ②    ④   ①
前缀:+ A - * B - C D / E F

注意: 先出栈的是“左操作数”

4.中缀表达式的计算(用栈实现)

两个算法的结合: 中缀转后缀 + 后缀表达式的求值

初始化两个栈,操作数栈 和运算符栈

若扫描到操作数,压人操作数栈

若扫描到运算符或界限符,则按照“中缀转后缀”相同的逻辑压入运算符栈 (期间也会弹出运算符,每当弹出一个运算符时,就需要再弹出两个操作数栈的栈项元素并执行相应运算,运算结果再压回操作数栈)

5. 知识回顾

在这里插入图片描述
在这里插入图片描述

3.3.3栈在递归中的应用

迷宫求解也用到栈

函数调用的特点:=最后被调用的函数最先执行结束(LIFO)

函数调用时,需要用一个栈存储:

  • 调用返回地址(下一条指令的地址)
  • 实参(传递的)
  • 局部变量(自己的)

递归调用时,函数调用栈称为 “递归工作栈”:

  • 每进入一层递归,就将递归调用所需信息压入栈顶;
    每退出一层递归,就从栈顶弹出相应信息;

缺点太多层递归可能回导致栈溢出(空间复杂度升高);也可能含有很多重复计算过程

适合用“递归”算法解决:可以把原始问题转换为属性相同,但规模较小的问题

调用过程

在这里插入图片描述
在这里插入图片描述

3.3.4 队列的应用

树的层次遍历、图的广度优先遍历、操作系统FCFS(先来先服务)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/801926.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux中Anaconda安装失败(Failed to execute script entry_point)的解决方法

Linux中Anaconda安装失败&#xff08;Failed to execute script entry_point&#xff09;的解决方法 报错信息&#xff1a; Failed to execute script entry_point 解决办法&#xff1a; 清理硬盘空间&#xff0c;确定区间内空间足够 Linux文件按大小排序 du -hs * | sort …

已解决:多线程环境中,新线程在使用cout函数打印输出到显示器出现数据混乱的情况

错误展示错误原因解决办法1. 在本问题情况下&#xff1a;使用printf函数替代cout&#xff1a;2. 使用互斥锁使 cout函数线程保持原子状态 什么是原子操作&#xff1f; 错误展示 最近学习多线程的时候&#xff0c;创建了一堆线程&#xff0c;然后每个线程都运行这个方法&#x…

了解Unity编辑器之组件篇Miscellaneous(九)

一、Aim Constraint&#xff1a;是一种动画约束&#xff0c;用于使一个对象朝向另一个对象或一个指定的矢量方向 Activate按钮&#xff1a;用于激活或停用Aim Constraint。当Aim Constraint处于激活状态时&#xff0c;其约束效果将应用于目标对象。 Zero按钮&#xff1a;用于将…

一款8000MHz的国产DDR5电竞内存条,光威神策系列DDR5只需900即可入手,

光威近期发布了一款能到8000MHz的DDR5内存新品&#xff0c;相比市场上现有的DDR5内存条&#xff0c;光威神策系列DDR5在性能和产品设计方面都有了较大的突破&#xff0c;是国产内存的典范型产品。这款内存DDR5以唐代“神策军”命名&#xff0c;国风色彩很明显&#xff0c;也是光…

一套不错的基于uniapp实现的投票类小程序/H5

最近作者心血来潮&#xff0c;想做一个热点话题投票&#xff0c;话题相关的资讯跟踪类的小程序&#xff0c;方便自己发布一些大家比较关心的话题。 基于以上需求&#xff0c;说干就干&#xff0c;首先需要定义一个需求&#xff1a; 1、支持热门话题投票、排行榜&#xff08;日…

注解和反射03--Class对象

注解和反射 Class类Class类的常用方法获取Class类的实例哪些类型可以有Class对象 Class类 在Object类重定义了以下的方法&#xff0c;此方法将被所有子类继承 public final Class getClass()以上的方法返回值的类型是一个Class类&#xff0c;此类是Java反射的源头&#xff0c…

【好文推荐】敏捷绩效考核如何做?

前言 一个Scrum团队有三个角色&#xff1a;产品负责人、开发团队和ScrumMaster。在Scrum里没有项目经理这个角色&#xff0c;传统项目经理的主要职责被分配到产品负责人和开发团队这两个角色中。产品负责人负责管理产品待办列表&#xff0c;开发团队自己组织和管理他们的工作。…

FreeRTOS(启动流程、编码风格、调试方法)

1、启动流程 1.1 方法一 在main函数中将硬件初始化、RTOS系统初始化&#xff0c;同时创建所有任务&#xff0c;再启动RTOS调度器。 1.2 方法二 在main函数中将硬件初始化、RTOS系统初始化&#xff0c;只创建一个启动任务&#xff0c;再启动RTOS调度器。 之后&#xff0c;在…

和我女神王冰冰一起学display: flex布局

前言 早期CSS布局依赖display属性position属性float属性。它对特殊的布局非常不方便&#xff0c;如&#xff0c;垂直居中。 于是&#xff0c;W3C在2009年提出了一种新的方案——Flex方案&#xff0c;可以简便、完整、响应式地实现各种页面布局。目前&#xff0c;它已经得到了…

Drupal YAML 反序列化代码执行漏洞(CVE-2017-6920)

事件背景 框架漏洞收集 老外的CMS框架&#xff0c;比较复杂&#xff0c;数据流向太长&#xff0c;调试需要消耗较多的时间。 漏洞说明 1. 漏洞原理&#xff1a;2017年6月21日&#xff0c;Drupal官方发布了一个编号为CVE-2017- 6920 的漏洞&#xff0c;影响为Critical。这是…

信驰达推出RTL8720DN系列2.4G和5G双频Wi-Fi+蓝牙二合一模块

近日&#xff0c;领先的无线物联网通信模块厂商深圳信驰达科技RF-star推出了基于RTL8720DN SoC的2.4 GHz和5 GHz双频Wi-Fi蓝牙二合一模块—RF-WM-20DNB1。 图 1信驰达RF-WM-20DNB1 Wi-Fi模块 RF-WM-20DNB1是一款低功耗单芯片无线蓝牙和Wi-Fi组合模块&#xff0c;支持双频(2.4 G…

关于骑行,这十个另类的励志文案,让人过目不忘。

在自行车骑行的世界里&#xff0c;有许多令人振奋和感动的励志句子。以下是一些令人过目不忘的另类励志文案&#xff0c;一定会给您的骑行生涯带来新的动力和激情&#xff1a; 1.骑行并非单纯的身体运动&#xff0c;而是需要灵魂的参与。2.自行车不会说话&#xff0c;但它会唱歌…

家庭用的无线洗地机到底好不好用?2023洗地机品牌排行榜前十名

无线洗地机在清洁使用的时候非常便捷&#xff0c;多功能于一体能够轻轻松松就拖扫完全家&#xff0c;不需要多余的先扫再拖&#xff0c;浪费时间还非常的劳累。那么有什么靠谱并且质量也有保障的无线洗地机推荐吗&#xff1f;为了给想要选购洗地机的小伙伴提供一些参考&#xf…

SpringMVC-mybatis中可以返回查询的个数,但是都为null。。。

通过postman测试请求时&#xff0c;显示查询成功&#xff0c;返回一个json数组&#xff0c;里面也有数据&#xff0c;但是数据都是null。 说明&#xff1a;确实是sql执行成功了&#xff0c;只不过是没有将sql中的字段的值给注入到对象的属性中去。。。 Select("SELECT * …

ArduPilot之433电传模块集成之H7Dual飞控Rx/Tx丝印问题

ArduPilot之433电传模块集成之H7Dual飞控Rx/Tx丝印问题 1. 源由2. 安装3. 排查3.1 电气连接3.2 软件配置3.3 模块测试3.4 通信测试3.5 定位问题 4. 总结5. 参考资料 1. 源由 鉴于最近iNav最新固件6.1.1出现远航炸机&#xff0c;还是回到相对可靠的Ardupilot&#xff0c;在Mavl…

Android 之 动画合集之属性动画 -- 又见

本节引言&#xff1a; 上节我们对Android的属性动画进行了初步的学习&#xff0c;相信大家对于属性动画已经不再是 一知半解的状态了&#xff0c;本节我们继续来探究Android属性动画的一些更高级的用法&#xff01; 1.Evaluator自定义 1&#xff09;Evaluator介绍 上一节中的…

黑马程序员-从0到1学习Linux-第三章-Linux用户和权限

目录 认知root用户 用户、用户组管理 查看权限控制 修改权限控制 - chmod 修改权限控制 - chown 认知root用户 1、root用户&#xff08;超级管理员&#xff09; 无论是Windows、MacOS、Linux均采用多用户的管理模式进行权限管理。 在Linux系统中&#xff0c;拥有最大…

数据库—数据库备份(三十四)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、概述 二、数据备份的重要性 三、造成数据丢失的原因 四、备份类型 4.1物理与逻辑角度 4.2数据库备份策略角度 五、常见的备份方法 5.1 物理备份 5.2 使用专用备…

物理机安装ESXI时遇到No Network Adapters

前不久在虚拟机下安装完成了ESXI&#xff0c;果断地使用了&#xff0c;确实很不错了&#xff0c; 配合我上次发的密匙&#xff08;https://www.cnntt.com/archives/5556&#xff09;妥妥爽。 虚拟机中试玩了一下&#xff0c;就开始布置到我的物理机上了&#xff0c;毕竟我以后…

【Python】Python 网络编程 ( Socket 套接字简介 | Socket 套接字使用步骤 | Socket 套接字服务端与客户端开发 )

文章目录 一、Socket 套接字简介1、Socket 套接字概念2、Socket 套接字类型3、Socket 套接字使用步骤4、Socket 套接字服务端与客户端 二、Socket 服务端与客户端开发1、服务端2、客户端3、执行结果 一、Socket 套接字简介 1、Socket 套接字概念 Socket 套接字 是一种 进程之间…