中缀转后缀 和 后缀表达式求值

波兰式、逆波兰式与表达式求值 波兰式、逆波兰式与表达式求值   《数据结构》中关于栈的解释经常会涉及到逆波兰式,波兰式,中缀式表达式的求值问题。但是,十分惭愧,整个大一阶段, 数据结构的课程没有上够5节,没有意识要学习,吃亏真的很大,只能现在恶补了。废话不说了,进入正题。 1. 中缀表达式 人类最熟悉的一种表达式1+2,(1+2)*3,3+4*2+4等等都是中缀表示法。对于人们来说,也是最直观的一种... 阅读详情

逆波兰表示法(Reverse Polish notation,RPN,或逆波兰记法)被称为后缀表示法,(当然波兰表示法 就是 前缀表示法)。
下面内容转载自:http://www.iteye.com/topic/1130373

如何书写逆波兰表达式:

先看一下怎么书写前缀表达式:
1. 如2+(3+4)*5这种我们最常见的式子就是中缀式。
2. 而把中缀式按运算顺序加上括号就是:(2+((3+4)*5))
3. 然后把运算符写到括号前面就是+(2 *( +(3 4) 5) )
4. 把括号去掉就是:+ 2 * + 3 4 5
5. 最后这个式子就是该表达式的前缀表示。
所以后缀表达式的书写应该和前缀表达式类似。但是这只是人为手工书写,如何用计算机写呢?

逆波兰表达式计算原理:

逆波兰表达式进行数据计算的时候一般分为两步:
1.将中缀表达式转换为后缀表达式
2.对转换完成后的后缀表达式进行计算

将中缀表达式转换为后缀表达式

第一步:将其转换为后缀表达式
1.首先我们要建立一个集合 sList 来存放例子中的数据和操作符号,一个栈opStack来存放中间的操作符号,一个集合dList 来存放最后的转换结果。

2.从sList中取出一个元素A然后进行以下判断:

       1.如果A是数字,则直接存如dList 
       2.如果A是运算符,则和opStack栈顶的元素进行运算优先级比较 
          1.如果A的优先级高于栈顶运算符优先级,则将A入栈opStack 
          2.如果A的优先级低于或等于栈顶运算符的优先级,那么将栈顶的元素出栈存入dList,
               重复此步骤直到栈顶的运算符优先级低于当前运算符,然后A入栈。 
          3.如果A是左括号“(”直接入栈,如果是右括号“)”,则将opStack中的运算符弹出
                 存入dList,直到弹出左括号,左右括号均不存入dList,左括号永远不会弹出,
                 直到遇到右括号。 
          4.不断重复以上步骤直到表达式解析完成。 

例子:我们以a+b-c*(d+e) 来进行分析
dList opStack

{} {}
{a} {} //a 加入dList
{a} {+} //+ 入栈
{a,b} {+} //b 加入dList
{a,b,+} {-} //+号出栈,-号入栈
{a,b,+,c} {-} //c 加入dList
{a,b,+,c} {-,} //因为 的优先级高于- 则将* 直接入栈
{a,b,+,c} {-,*,(} //左括号直接入栈
{a,b,+,c,d} {-,*,(} //d 加入dList
{a,b,+,c,d} {-,*,(,+} //+ 直接入栈
{a,b,+,c,d,e} {-,*,(,+} //e 直接加入dList
{a,b,+,c,d,e,+} {-,*} //将左括号之上的符号出栈加入dList
{a,b,+,c,d,e,+,*,-} {} //将栈中的剩余元素弹出

将dList 中的元素输出,则得到后缀表达式:ab+cde+*-

后缀表达式求值算法

首先建立一个结果栈rStack,然后将dList中的元素依次取出,进行入栈操作,如果碰到操作符就从栈中取出两个元素进行运算,结果入栈,依次重复。
注意: 每次从dList取出元素时,是从栈底取出的,并不是从栈顶取出的。因为这里dList用的是容器,所以才会没什么问题。

下面接着看上面的例子
dList {a,b,+,c,d,e,+,*,-}

rStack
{ }
{a} //a入栈
{a,b} //b入栈
{a+b} //遇到+号,取出两个操作数进行运算,运算结果入栈
{a+b,c}
{a+b,c,d}
{a+b,c,d,e}
{a+b,c,d+e}

{a+b,c*(d+e)}
{a+b-c*(d+e)}

计算结果:a+b-c*(d+e)

参考博客:
http://www.iteye.com/topic/1130373
http://blog.youkuaiyun.com/shiwazone/article/details/47067921

【c++】后缀表达式求值(详解) 后缀表达式的介绍和详细代码实现,计算逆波兰表达式的结果,用C++实现 阅读详情

相关推荐

【OJ - stack】中缀表达式转后缀表达式 & 后缀(逆波兰)表达式的计算

OJ - 中缀表达式转后缀表达式 题目难度:简单 OJ链接:中缀表达式转后缀表达式_牛客网 (nowcoder.com) 将中缀表达式转为后缀表达式(逆波兰表达式),输入 a+b*c/d-a+f/b 输出 abc*d/+a-fb/+ 要求:语言不限;输入输出均为单个字符串;操作数用单个小写字母表示,操作符只需支持 ±*/,按照四则运算顺序确定优先级,不包含括号。 示例: 输入:a+b*c/d-a+f/b 输出:abc*d/+a-fb/+ // 操作符跟在它要运算的操作数的后面,按优先级排列 解题思路

codewinter的博客 1039

HDU-简单计算器-1237

用栈的算法中缀表达式转换后缀表达式

灰色头像不会再跳动 1122

C++实现中缀表达式转后缀求值的详细指南

函数内部将通过以下步骤完成转换:1. 初始化一个栈用于存储运算符,同时准备一个字符串用于存放后缀表达式结果。2. 从左至右扫描中缀表达式中的每个字符。3. 遇到操作数时,直接将其添加到后缀表达式字符串中。4. 遇到运算符时,根据运算符优先级与栈顶运算符进行比较,进行相应的入栈、出栈操作,直至运算符可以入栈。5. 表达式扫描结束后,处理栈中剩余的运算符,将其逐一弹出并添加到后缀表达式字符串中。

weixin_32925455的博客 1150

中缀表达式转后缀表达式

中缀表达式转后缀表达式 (本文为笔者个人学习笔记,如有不当之处恳请各位读者指正)       在一些简单的加减乘除算式中我们可以很容易的看出哪个运算符要先进行计算,但对于计算机来说却并不容易。为了能让计算机能够准确的计算出结果,我们需要将算式进行简单的转换,将优先级高的运算符排在前面,即将中缀表达式转化为后缀表达式(逆波兰式)。     例如给出前缀表达式:1+2*(4-3),很明显在这个...

雨沐风林的博客 1170

群晖NAS断电后IP变了?3步搞定静态IP设置(附Linux挂载指南)

本文针对群晖NAS因断电重启导致IP地址变化的问题,提供了从根源到实践的完整解决方案。核心内容包括如何为NAS配置静态IP以彻底解决连接中断,并详细讲解了在Linux系统中通过NFS协议稳定挂载NAS共享文件夹的步骤与指南,确保网络存储服务持久可靠。

weixin_29271263的博客 858

李大勇matlab密码,基于MatlabSimulink的太阳能热水系统仿真研究 沈超.doc

基于MatlabSimulink的太阳能热水系统仿真研究 沈超中国工程热物理学会 工程热力学与能源利用 编号:141090基于Matlab/Simulink的太阳能热水系统仿真研究沈 超1 1 余 鹏1 李洪欣1 魏新利2郑州大学土木工程学院,郑州 450001郑州大学化工与能源学院,郑州 45...

weixin_42298437的博客 1344

中缀表达式转换为后缀表达式

中缀表达式转换为后缀表达式运算符的优先级考虑例子 运算符的优先级考虑 将中缀表达式转换为相应的后缀表达式,需要根据操作符的优先级来进行栈的变化,我们用icp来表示当前扫描的运算符ch的优先级,该运算符进栈后的优先级为isp,则运算符的优先级如下表所示: isp是栈内优先,icp是栈外优先。 操作符 # ( * / + - ) isp 0 1 5 3 6 icp 0 6 4 2 1 例子 将中缀表达式 a+b-a*((c+d)/e-f)+g 转为后缀表达式 步骤 扫描项

qq_42534430的博客 1039

Arnold Denoise流程

参考:https://support.solidangle.com/display/ARP/Removing+Noise+Workflow Arnold生来不是一个以单帧渲染速度见长的渲染器,但这并不能作为一个简单场景渲染时间长达几个小时的借口。 个人认为高品质生产级渲染结果中,Unbiased renderer在渲染时最耗计算时间的其实就是降噪,以至于降噪专门成了一门灯光师必备的技术

机器猫的CG空间 5084

中缀转化后缀表达式-编译原理-算符优先分析算法

中缀表达式转化为后缀表达式一级目录二级目录三级目录 一级目录 二级目录 三级目录

weixin_43434136的博客 1706

QMK固件OLED显示屏配置教程:从零开始实现个性化键盘显示(实操部分)

本教程详细介绍了如何从零开始配置QMK固件的OLED显示屏,实现个性化键盘显示。首先,文章解释了OLED显示屏的基本概念及其在键盘中的应用,并介绍了I2C和SPI两种通信方式。接着,教程逐步指导用户如何在QMK固件中启用OLED功能,包括在rules.mk中启用OLED、在halconf.h和mcuconf.h中配置I2C功能,以及在config.h中设置I2C和OLED参数。最后,教程展示了如何在keymap.c中编写代码,实现OLED显示内容,并提供了进阶定制功能,如显示当前层信息、按键状态和QMK L

Despacito0o的博客 581

IP-guard发布新版本4.87.2241.0

IP-guard发布了新版本4.87.2241.0,用户可通过提供的下载地址获取完整安装包和升级包。下载后,用户需联系厂家申请测试序列号以进行安装和使用。IP-guard是一款专注于企业文件加密、文档加密系统、防泄密软件、数据安全的软件。

IP-Guard专栏 1531

C++表达式求值与转换(前缀、中缀、后缀)

C++表达式求值与转换(前缀、中缀、后缀)

m0_53889370的博客 6611

我的世界进阶模组开发教程——制作机械动力附属模组

摘要: Create是Minecraft的机械动力模组,其代码结构分为多个关键模块: 数据生成系统:通过CreateRecipeProvider基类实现配方自动化生成,支持多步骤序列化装配配方(SequencedAssemblyRecipeGen),采用建造者模式链式调用; 注册管理:CreateRegistrate扩展了Registrate库,统一管理方块、流体、实体等注册,集成标签页分类和工具提示定制; 伤害系统:DamageTypeTagGen为机械伤害(如钻头、风扇火焰)定义原版兼容的标签; 客户端

qq_24992377的博客 2083

【Java】中缀表达式转后缀表达式和后缀表达式四则运算求值(栈)

实现一个简单的计算器,输入一个算术表达式,其运算符包含圆括号、加、减、乘、除、求余等符号,输出该算术表达式的值。要求:(1)系统至少能实现加、减、乘、除、求余等运算;(2)利用栈的后进先出特性实现;

m0_73520938的博客 745

Git救援:如何从误操作中恢复未提交的更改

摘要:本文探讨了误操作git reset --hard导致未提交更改丢失后的恢复方法。首先分析git reflog的局限性,随后介绍利用IDE本地历史记录(如IntelliJ IDEA和VS Code)进行文件恢复的具体步骤。最后建议使用文件系统恢复工具(如Linux的extundelete或Windows的Recuva)作为备选方案。文章强调定期提交的重要性,同时提供了意外发生时可行的恢复策略,帮助开发者尽可能挽回丢失的工作内容。(149字)

2501_90323865的博客 129

深度剖析XY2-100与SL2-100协议:解锁激光打标核心技术密码

XY2-100和SL2-100是激光打标领域的两种核心控制协议。XY2-100协议采用串行通信,指令集简单,适合常规打标任务,具有成本优势;SL2-100协议支持更高速率(1Mbps以上),具备曲线插补等高级指令,在精密加工领域表现突出。两者的主要差异体现在数据传输(帧结构、速率)、指令集(功能、数量)、参数调节(范围、精度)和错误处理机制等方面。实际应用中,XY2-100适合简单图形的大批量生产,SL2-100更胜任复杂曲面的高精度加工。选择时需综合考虑打标需求、设备兼容性和成本因素,未来两种协议将持续优

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 958

中缀/后缀/前缀表达式及相互转换的手算详细步骤及C代码实现

中缀表达式、前缀表达式、后缀表达式

我是一只小嵩鼠 6804

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

LeetCode :150. 逆波兰表达式求值(含求后缀表达式和中缀转后缀表达式)

LeetCode :150. 逆波兰表达式求值(含求后缀表达式和中缀转后缀表达式),数据结构与算法

好好学习 717

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

王道考研 ++++ 表达式求值(C语言 中缀表达式转换为后缀表达式+代码)

参考博文:https://blog.youkuaiyun.com/sgbfblog/article/details/8001651 实现 一、后缀表达式求值 后缀表达式也叫逆波兰表达式,其求值过程可以用到栈来辅助存储。假定待求值的后缀表达式为:6523+ 8 * + 3+*,则其求值过程如下: 1)遍历表达式,遇到的数字首先放入栈中,此时栈如下所示: 2)接着读到“+”,则弹出...

eacape 2824

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

NO.3数据结构栈和队列|顺序栈|共享栈|链栈|顺序队|循环队列|链队|双端队列|括号匹配|中缀表达式转后缀|后缀表达式求值

栈与队列数据结构总结 栈是一种后进先出(LIFO)的线性表,只允许在栈顶进行插入和删除操作。顺序栈采用数组实现,需要判满/空;链栈采用链表实现,更灵活。共享栈可以有效利用存储空间。n个元素进栈的不同出栈序列数满足卡特兰函数。 队列是一种先进先出(FIFO)的线性表,在队尾插入,队头删除。顺序队列存在假溢出问题,循环队列通过取模运算解决。链队列使用带队头队尾指针的链表实现。判断循环队列空/满有多种方法,如牺牲一个单元、使用size变量或tag标记。 两种数据结构都有顺序和链式两种存储方式,基本操作包括初始化、

ChoSeitaku的博客 935

数据结构与算法- 前缀、中缀、后缀表达式

数据结构与算法- 前缀、中缀、后缀表达式1、前缀、中缀、后缀表达式1.1 介绍1.2 转前缀表达式在计算机求值1.2.1 流程、举例1.2.2 代码实现1.3 中缀表达式转前缀表达式1.3.1 思路分析1.4 后缀表达式在计算机求值1.4.1 流程、举例1.4.2 代码实现1.5 中缀表达式转后缀表达式(常用)1.5.1 思路分析1.5.2 代码实现 1、前缀、中缀、后缀表达式 1.1 介绍 前缀表达式 (波兰表达式): 运算符位于操作数之前,(1+2)*3-4 对应的前缀表达式为 - * + 1 2 3

咏樟的博客 2641

Java数据结构:前缀、中缀、后缀表达式与逆波兰计算器的实现

本文对前缀、中缀、后缀表达式进行了讲解,实现了中缀表达式转后缀表达式,并利用栈实现了逆波兰表达式计算器求值。

黄小黄的博客 2874

中缀表达式转逆波兰表达式(后缀表达式)

总结波兰表达式与逆波兰表达式,用代码实现中缀表达式转逆波兰表达式。

Jacks丶的博客 8047

简单算术表达式求值

本文主要探讨简单的数学算术表达式求值算法的原理和实现。

键盘上的手艺人 5314

前缀、中缀、后缀表达式-java,中缀转后缀,逆波兰计算器实现

前缀、中缀、后缀表达式一、前缀表达式(波兰表达式)1. 前缀表达式的计算机求值二、中缀表达式三、后缀表达式1. 后缀表达式的计算机求值四、中缀转后缀表达式五、逆波兰计算器 一、前缀表达式(波兰表达式) 前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前 举例说明: (3+4)×5-6 对应的前缀表达式就是 - × + 3 4 5 6 1. 前缀表达式的计算机求值 从右至左扫描表达式,遇...

cheng87995211的博客 806
上一篇: 名校和非名校最重要差距,悄悄影响着我们的一生
下一篇: 前缀式表达式求值
丁磊_Ml
博客等级 码龄11年 95粉丝 139原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值