数据结构--栈的引用--前中后缀表达式(前部分)

news2024/11/17 13:53:30

数据结构–栈的引用–前中后缀表达式(前部分)

常见的算数表达式

由三个部分组成: 操作数、运算符、界限符 \color{red}操作数、运算符、界限符 操作数、运算符、界限符

ps:界限符是必不可少的,反映了计算的先后顺序

波兰表达式(让计算机更容易识别的算数表达式)

Reverse Polish notation(逆波兰表达式=后缀表达式)
Polish notation(波兰表达式=前缀表达式)

中缀 \color{red}中缀 中缀表达式:
运算符在两个操作数中间

a+b
a +b - c
a+b - c * d

后缀 \color{red}后缀 后缀表达式:
规则:运算符在两个操作数后面

a b +
a b+ c-
a b +cd *-

前缀 \color{red}前缀 前缀表达式:
规则:运算符在两个操作数前面

+a b
-+a b c
-+a b * c d

后缀表达式

后缀表达式的计算(手算)

中缀转后缀 \color{red}中缀转后缀 中缀转后缀 手算方法 \color{green}手算方法 手算方法:
①确定中缀表达式中 各个运算符的运算顺序 \color{red}各个运算符的运算顺序 各个运算符的运算顺序
②选择下一个运算符,按照 「左操作数右操作数运算符」 \color{purple}「左操作数右操作数运算符」 「左操作数右操作数运算符」的方式组合成一个新的操作数
③如果还有运算符没被处理,就继续②

我们发现对于同一个中缀表达式按这个方法可能会有多个后缀表达式

原因:
运算顺序不唯一,因此对应的后缀表达式也不唯一

一:


二:


客观来看两种都正确,只是“机算”结果是前者

所以我们可以规定一个原则:
“左优先”原则 \color{red}“左优先”原则 左优先原则,这样可以保证结果的唯一性

后缀表达式的手算方法:

从左往右扫描,每遇到一个运算符,就让 运算符前面最近的两个操作数 \color{red}运算符前面最近的两个操作数 运算符前面最近的两个操作数执行对应运算, 合体为一个操作数 \color{red}合体为一个操作数 合体为一个操作数
注意:两个操作数的左右顺序

特点:
最后出现的操作数先被运算
LIFO(后进先出) → \to

后缀表达式的计算(机算)

用栈实现后缀表达式的计算:
①从左往右扫描下一个元素,直到处理完所有元素②若扫描到操作数则压入栈,并回到①;否则执③
③若扫描到运算符,则弹出两个栈顶元素,执行相应运算,运算结果压回栈顶,回到①

注意:先出栈的是“右操作数” \color{pink}注意:先出栈的是“右操作数” 注意:先出栈的是右操作数
若表达式合法 , 则最后栈中只会留下一个元素,就是最终结果 \color{pink}若表达式合法,则最后栈中只会留下一个元素,就是最终结果 若表达式合法,则最后栈中只会留下一个元素,就是最终结果

根据给定的中缀表达式"AB+CD*E/-F+",我们可以逐步生成后缀表达式,并记录每一步栈的情况。下面是每一步的栈情况:

  1. 初始时,栈为空。
  2. 遇到’A’,将其入栈。栈:A
  3. 遇到’B’,将其入栈。栈:AB
  4. 遇到’+‘,由于栈顶是运算符’+',优先级相同,所以将栈顶元素出栈并加入后缀表达式中。栈:A,后缀表达式:AB+
  5. 遇到’C’,将其入栈。栈:AC,后缀表达式:AB+
  6. 遇到’D’,将其入栈。栈:ACD,后缀表达式:AB+
  7. 遇到’‘,由于栈顶是运算符’‘,优先级高于’',所以将栈顶元素出栈并加入后缀表达式中。栈:AC,后缀表达式:AB+CD
  8. 遇到’E’,将其入栈。栈:ACE,后缀表达式:AB+CD*
  9. 遇到’/‘,由于栈顶是运算符’‘,优先级高于’/',所以将栈顶元素出栈并加入后缀表达式中。栈:AC,后缀表达式:AB+CDE/
  10. 遇到’-‘,由于栈顶是运算符’/‘,优先级低于’-‘,所以将’-'入栈。栈:AC-,后缀表达式:AB+CD*E/
  11. 遇到’F’,将其入栈。栈:AC-F,后缀表达式:AB+CD*E/
  12. 遇到’+‘,由于栈顶是运算符’-',优先级相同,所以将栈顶元素出栈并加入后缀表达式中。栈:AC,后缀表达式:AB+CD*E/-F+
  13. 遍历完中缀表达式,将栈中剩余的运算符全部出栈并加入后缀表达式中。栈:空,后缀表达式:AB+CD*E/-F+

最终得到的后缀表达式为"AB+CD*E/-F+",栈为空。

注意:上述过程中,我们使用了一个栈来辅助转换为后缀表达式。当遇到运算符时,我们需要判断栈顶元素与当前运算符的优先级,根据优先级决定是否出栈并加入后缀表达式中。

前缀表达式

中缀表达式转前缀表达式(手算)

中缀转前缀的手算方法:
①确定中缀表达式中 各个运算符的运算顺序 \color{red}各个运算符的运算顺序 各个运算符的运算顺序
②选择下一个运算符,按照 「运算符左操作数右操作数」 \color{red}「运算符左操作数右操作数」 「运算符左操作数右操作数」的方式组合成一个新的操作数
③如果还有运算符没被处理,就继续②
“右优先”原则 \color{red}“右优先”原则 右优先原则:只要右边的运算符能先计算,就优先算 右边 \color{red}右边 右边

中缀表达式转前缀表达式(计算)

用栈实现前缀表达式的计算:
从右往左 \color{red}从右往左 从右往左扫描下一个元素,直到处理完所有元素
注意 : 先出栈的是“左操作数” \color{pink}注意:先出栈的是“左操作数” 注意:先出栈的是左操作数
②若扫描到操作数则压入栈,并回到①;否则执行③
③若扫描到运算符,则弹出两个栈顶元素,执行相应运算,运算结果压回栈顶,回到①

首先,我们需要理解前缀表达式的计算过程。前缀表达式是一种将运算符放在操作数之前的表达式表示方法。计算前缀表达式时,我们从右到左遍历表达式,遇到操作数则将其入栈,遇到运算符则从栈中取出两个操作数进行运算,并将运算结果再次入栈。最后,栈中只剩下一个结果,即为表达式的计算结果。

根据题目给出的前缀表达式:/ 15 -7 + 1 1 3 + 2 + 1 1

我们按照计算过程来模拟每一步栈的情况:

  1. 遇到15,入栈:[15]
  2. 遇到-7,入栈:[-7, 15]
  3. 遇到+,从栈中取出两个操作数-7和15,计算结果为8,将结果入栈:[8]
  4. 遇到1,入栈:[1, 8]
  5. 遇到1,入栈:[1, 1, 8]
  6. 遇到3,入栈:[3, 1, 1, 8]
  7. 遇到+,从栈中取出两个操作数3和1,计算结果为4,将结果入栈:[4, 1, 8]
  8. 遇到2,入栈:[2, 4, 1, 8]
  9. 遇到+,从栈中取出两个操作数2和4,计算结果为6,将结果入栈:[6, 1, 8]
  10. 遇到1,入栈:[1, 6, 1, 8]
  11. 遇到1,入栈:[1, 1, 6, 1, 8]
  12. 遇到+,从栈中取出两个操作数1和1,计算结果为2,将结果入栈:[2, 6, 1, 8]
  13. 遇到/,从栈中取出两个操作数2和6,计算结果为3,将结果入栈:[3, 1, 8]
  14. 遇到+,从栈中取出两个操作数3和1,计算结果为4,将结果入栈:[4, 8]
  15. 遇到/,从栈中取出两个操作数4和8,计算结果为0.5,将结果入栈:[0.5]

最终栈中只剩下一个结果0.5,即为表达式的计算结果。

每一步栈的情况如下:

  1. [15]
  2. [-7, 15]
  3. [8]
  4. [1, 8]
  5. [1, 1, 8]
  6. [3, 1, 1, 8]
  7. [4, 1, 8]
  8. [2, 4, 1, 8]
  9. [6, 1, 8]
  10. [1, 6, 1, 8]
  11. [1, 1, 6, 1, 8]
  12. [2, 6, 1, 8]
  13. [3, 1, 8]
  14. [4, 8]
  15. [0.5]

知识点回顾与重要考点

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

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

相关文章

高性能分布式缓存Redis(一) 快速实战

一、缓存发展史&缓存分类 1.1、大型网站中缓存的使用 访问量越大,响应力越差,用户体验越差。 引入缓存、示意图如下: 读写策略: Cache Aside Pattern(旁路缓存模式)Read/Write Through Pattern&am…

AA-TransUNet github: 用于预测任务的注意力增强的TransUNet

文章目录 来源AA_TransUNet架构数据集和预训练模型使用作者 来源 github地址 AA_TransUNet架构 数据集和预训练模型 如果你对本文中使用的数据集(降水图和云量数据集)感兴趣,请访问SmaAt-UNet了解更多细节。 对于预训练的AA_TransUNet模型…

从磁盘看 IO

计算机上的易失和非易失存储器 常见磁盘可以分为两类:机械磁盘和固态磁盘。 第一类,机械磁盘,也称为硬盘驱动器(Hard Disk Driver),通常缩写为 HDD。机械磁 盘主要由盘片和读写磁头组成,数据就…

认识固态继电器及其工作原理

什么是固态继电器,有什么优缺点? 固态继电器 简称SSR,又被称之为“无触点开关”它利用电子元件(如双向可控硅等半导体器件)的开关特性,可到达无触点无火花地接通和断开电路。 固态继电器工作可靠&#…

1.3 Metasploit 生成SSL加密载荷

在本节中,我们将介绍如何通过使用Metasploit生成加密载荷,以隐藏网络特征。前一章节我们已经通过Metasploit生成了一段明文的ShellCode,但明文的网络传输存在安全隐患,因此本节将介绍如何通过生成SSL证书来加密ShellCode&#xff…

ChatGPT应用工具推荐

ChatGPT作为一种先进的自然生成技术,已经在各个领域展现出了其强大的应用能力,下面将给大家介绍一些ChatGPT的功能应用。 简介 此系统是基于likeadmin—PHP开发的智能对话系统,ChatGPT是一种基于人工智能技术的聊天机器人,它可以…

如何利用AI智能聊天机器人 10秒钟做出一个故事绘本的神奇插件

原文链接:如何利用AI智能聊天机器人10秒钟做出一个故事绘本的神奇插件 C_h~at_&G&&P_T : 以下称为AI智能聊天机器人 一、AI智能聊天机器人4中集成“Stories”插件 对于已经熟悉使用AI智能聊天机器人4 的插件的朋友们,直接在应用市场里搜索…

vtkdicom0.8_vtk9.2_dcmtk3.6.7_qt6.2编译OK

目录 0 结果展示 1 cmake要点 2 编译报错解决 3 参考链接 0 结果展示 1 cmake要点 注意DCMTK_dcmtk_INCLUDE_DIR 2 编译报错解决 D:\Work\C\qt6Work\DCMTK\install\bin\dcmtkcharls.dll : fatal error LNK1107: 文件无效或损坏: 无法在 0x308 处读取 修改,从…

docker安装mysql并且进行连接

1、拉取镜像、在linux中执行命令 docker pull mysql 2、运行容器、在linux中执行命令 docker run -d --name mysql -p 3308:3306 -e MYSQL_ROOT_PASSWORD123456 mysql3、 进入容器、在linux中执行命令 docker ps -a docker exec -it 2a85f05d4090 /bin/bash 4、登录docker中的m…

MySQL日志详解

♥️作者:小刘在C站 ♥️个人主页: 小刘主页 ♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏&#xf…

基于SpringBoot+vue的校园新闻网站设计与实现

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

移动WEB开发之流式布局

css基础(一)css基础(一)_上半场结束,中场已休息,下半场ing的博客-CSDN博客Emmet语法Emmet语法_上半场结束,中场已休息,下半场ing的博客-CSDN博客css基础(二)c…

go语言学习笔记1

go语言简介 ​ GoLang是一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言;它可以在不损失应用程序性能的情况下极大的降低代码的复杂性,还可以发挥多核处理器同步多工的优点,并可解决面向对象程序设计的麻烦&#x…

2.ThreadLocalRandom

Random类及其局限性 一般情况下&#xff0c;我们都会使用java.util.Random来生成随机数&#xff08;Math.random()也是使用Random实例生成随机数&#xff09;。 示例 public static void main(String[] args) {Random random new Random();for (int i 0; i < 10; i) {S…

热搜第一!携程宣布每生一个娃奖5万!

6月30日&#xff0c;在线旅游平台携程集团宣布&#xff0c;他们全新推出一项针对全球员工的生育补贴政策。 从2023年7月1日开始&#xff0c;入职满3年的全球员工&#xff0c;无论你是男是女&#xff0c;每生育一个孩子&#xff0c;就将为你获得每年一万元的现金补贴。而这份补贴…

从vue2学习vue3

vue3与vue2的区别 Vue 3在写法上与Vue 2有一些区别&#xff0c;以下是一些常见的区别&#xff1a;引入方式&#xff1a;Vue 2使用Vue全局对象进行引入&#xff0c;而Vue 3使用createApp函数创建应用实例。组件注册&#xff1a;Vue 2中使用Vue.component全局方法或在选项中使用…

Python用if-else实现【猜数字】

文章目录 Python 猜数字案例代码实现&#xff1a;运行效果&#xff1a; Python 猜数字案例 设置一个范围1-100的随机整数变量&#xff0c;通过while循环&#xff0c;配合input语句&#xff0c;判断输入的数字是否等于随机数 无限次机会&#xff0c;直到猜中为止每一次猜不中&am…

1.Springboot基础篇笔记

Springboot基础篇 1.快速上手Springboot 1.基础配置 1.parent 通过配置指定父工程依赖为spring-boot-starter-paerent实现了版本管理的功能&#xff0c;再导入springboot整合其他技术的jar包即可 作用&#xff1a;指定jar包版本信息信息&#xff0c;避免依赖版本冲突 这个s…

理解 flask中request中form、data、json、values属性的区别

flask的request对象中关于请求参数的获取有几个不同的属性,例如 args、form、data、json。估计大部分人一开始也分不清什么情况下哪个属性有值,哪个属性没值,这篇文章全面整理了这几个属性之间的区别和使用场景。 flask.request对象其实是对HTTP请求的一种封装,我们知道HT…

Fidder抓包工具基础+postman调试测试

1、下载地址 汉化Fiddler Web Debugger(5.0.20192.25092)中文版 2、配置参数初始化 开启 fidder 百度即可 3、抓包 核心&#xff1a; 入参 出参 4、如何把包的数据放到postman发生请求 保存一个文件&#xff0c;选择格式 保存文件 自定义名称 将har 包托人 postman 即可 &…