前缀(波兰表达式) 中缀 后缀(逆波兰表达式)
前缀、中缀、后缀表达式(逆波兰表达式)
本文转自https://www.cnblogs.com/chensongxian/p/7059802.html
介绍
前缀表达式、中缀表达式、后缀表达式都是四则运算的表达方式,用以四则运算表达式求值
,即数学表达式的求职
中缀表达式
简介
中缀表达式就是常见的运算表达式,如(3+4)×5-6
前缀表达式
简介
前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前
比如:- × + 3 4 5 6
前缀表达式的计算机求值
从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果
例如:- × + 3 4 5 6
- 从右至左扫描,将6、5、4、3压入堆栈
- 遇到+运算符,因此弹出3和4(3为栈顶元素,4为次顶元素,注意与后缀表达式做比较),计算出3+4的值,得7,再将7入栈
- 接下来是×运算符,因此弹出7和5,计算出7×5=35,将35入栈
- 最后是-运算符,计算出35-6的值,即29,由此得出最终结果
将中缀表达式转换为前缀表达式
转换步骤如下:
- 初始化两个栈:运算符栈s1,储存中间结果的栈s2
- 从右至左扫描中缀表达式
- 遇到操作数时,将其压入s2
- 遇到运算符时,比较其与s1栈顶运算符的优先级
- 如果s1为空,或栈顶运算符为右括号“)”,则直接将此运算符入栈
- 否则,若优先级比栈顶运算符的较高或相等,也将运算符压入s1
- 否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4-1)与s1中新的栈顶运算符相比较
- 遇到括号时
- 如果是右括号“)”,则直接压入s1
- 如果是左括号“(”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到右括号为止,此时将这一对括号丢弃
- 重复步骤2至5,直到表达式的最左边
- 将s1中剩余的运算符依次弹出并压入s2
- 依次弹出s2中的元素并输出,结果即为中缀表达式对应的前缀表达式
例如:1+((2+3)×4)-5具体过程,如下表
扫描到的元素 | S2(栈底->栈顶) | S1 (栈底->栈顶) | 说明 |
---|---|---|---|
5 | 5 | 空 | 数字,直接入栈 |
- | 5 | - | s1为空,运算符直接入栈 |
) | 5 | -) | 右括号直接入栈 |
4 | 5 4 | -) | 数字直接入栈 |
x | 5 4 | -)x | s1栈顶是右括号,直接入栈 |
) | 5 4 | -)x) | 右括号直接入栈 |
3 | 5 4 3 | -)x) | 数字 |
+ | 5 4 3 | -)x)+ | s1栈顶是右括号,直接入栈 |
2 | 5 4 3 2 | -)x)+ | 数字 |
( | 5 4 3 2 + | -)x | 左括号,弹出运算符直至遇到右括号 |
( | 5 4 3 2 + x | - | 同上 |
+ | 5 4 3 2 + x | -+ | 优先级与-相同,入栈 |
1 | 5 4 3 2 + x 1 | -+ | 数字 |
到达最左端 | 5 4 3 2 + x 1 + - | 空 | s1剩余运算符 |
结果是:- + 1 × + 2 3 4 5
后缀表达式
简介
后缀表达式又称逆波兰表达式,与前缀表达式相似,只是运算符位于操作数之后
比如:3 4 + 5 × 6 -
后缀表达式计算机求值
与前缀表达式类似,只是顺序是从左至右:
从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 op 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果
例如后缀表达式“3 4 + 5 × 6 -”:
- 从左至右扫描,将3和4压入堆栈;
- 遇到+运算符,因此弹出4和3(4为栈顶元素,3为次顶元素,注意与前缀表达式做比较),计算出3+4的值,得7,再将7入栈;
- 将5入栈;
- 接下来是×运算符,因此弹出5和7,计算出7×5=35,将35入栈;
- 将6入栈;
- 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。
将中缀表达式转换为后缀表达式
与转换为前缀表达式相似,步骤如下:
- 初始化两个栈:运算符栈s1和储存中间结果的栈s2;
- 从左至右扫描中缀表达式;
- 遇到操作数时,将其压s2;
- 遇到运算符时,比较其与s1栈顶运算符的优先级:
- 如果s1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈;
- 否则,若优先级比栈顶运算符的高,也将运算符压入s1(注意转换为前缀表达式时是优先级较高或相同,而这里则不包括相同的情况);
- 否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4-1)与s1中新的栈顶运算符相比较;
- 遇到括号时:
- 如果是左括号“(”,则直接压入s1;
- 如果是右括号“)”,则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃;
- 重复步骤2至5,直到表达式的最右边;
- 将s1中剩余的运算符依次弹出并压入s2;
- 依次弹出s2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式(转换为前缀表达式时不用逆序)
例如,将中缀表达式“1+((2+3)×4)-5”转换为后缀表达式的过程如下:
扫描到的元素 | s2(栈底->栈顶) | s1 (栈底->栈顶) | 说明 |
---|---|---|---|
1 | 1 | 空 | 数字,直接入栈 |
+ | 1 | + | s1为空,运算符直接入栈 |
( | 1 | + ( | 左括号,直接入栈 |
( | 1 | + ( ( | 同上 |
2 | 1 2 | + ( ( | 数字 |
+ | 1 2 | + ( ( + | s1栈顶为左括号,运算符直接入栈 |
3 | 1 2 3 | + ( ( + | 数字 |
) | 1 2 3 + | + ( | 右括号,弹出运算符直至遇到左括号 |
× | 1 2 3 + | + ( × | s1栈顶为左括号,运算符直接入栈 |
4 | 1 2 3 + 4 | + ( × | 数字 |
) | 1 2 3 + 4 × | + | 右括号,弹出运算符直至遇到左括号 |
- | 1 2 3 + 4 × + | - | -与+优先级相同,因此弹出+,再压入- |
5 | 1 2 3 + 4 × + 5 | - | 数字 |
到达最右端 | 1 2 3 + 4 × + 5 - | 空 | s1中剩余的运算符 |
因此结果为“1 2 3 + 4 × + 5 -”
前缀(波兰表达式) 中缀 后缀(逆波兰表达式)相关推荐
- 中缀表达式转换成逆波兰式
栈的应用:中缀表达式转换成逆波兰式 小白前来报道!懒癌患者的第一篇博客,实属不易,先为自己鼓个掌. 编写程序,将任意一个合法的中缀表达式转换成逆波兰式. [问题描述]表达式计算是实现程序设计语言的基本 ...
- 将表达式转换成逆波兰式
http://www.cnblogs.com/stay-foolish/archive/2012/04/25/2470590.html 假设表达式由单字母变量和双目四则运 算算符构成.试写一个算法,将 ...
- 设计一个算法,将一般算术表达式转化为逆波兰表达式,并求逆波兰表达式的值
栈的设计与使用 实验内容 设计一个算法,将一般算术表达式转化为逆波兰表达式,并求逆波兰表达的值 解题思路 (1)一般算术表达(中缀表达),如#3×(4+2)/2-5#,#为表达式界定符,逆波兰表达式( ...
- php逆波兰表达式,PHP实现逆波兰式 - 计算工资时用
近期一个小项目需要用到公式运算, 所以就进行一些了解,以下内容均属于个人经验. 在PHP中实现公式表达式四则运算大概有两种方法: 1)使用系统函数eval 2)将表达式转换成逆波兰表达式进行计算. / ...
- 编译原理逆波兰式实验java_逆波兰式算法的编译原理实验过程.doc
逆波兰式算法的编译原理实验过程 实验目的 深入理解算符优先分析法 掌握FirstVt和LastVt集合的求法有算符优先关系表的求法 掌握利用算符优先分析法完成中缀表达式到逆波兰式的转化 实验内容及要求 ...
- NPI (Neural Program Interpreter) 逆波兰表达式--什么是逆波兰表达式
打算详细的写一下NPI, 感觉这个蛮帅的.第一篇就先介绍一下要解决的问题了. 中置表达式与逆波兰 "先算乘除,再算加减,最先算括号",这是数学老师告诉我们的用来解决表达式的口诀,可 ...
- php 逆波兰 if,什么是逆波兰式?
逆波兰式的英文全称是"Reverse Polish notation",也叫后缀表达式,逆波兰式在计算机看来是比较简单易懂的结构,因为计算机普遍采用的内存结构是栈式结构,它执行先进 ...
- 波兰表示法与逆波兰表示法
身为初学者,能力有限,知识尚少,如有纰漏,还望海涵. 对于表达式,通常有三种表示方法,前.中.后缀表示法.我们日常使用的数学算式就是中缀表示法.例:1+5*10-10/2 码文不易,希望支持,谢谢 ...
- JAVA实现逆波兰转换,java实现逆波兰式
package com.yj.rpn; import java.util.*; import java.util.logging.StreamHandler; /** * Created by yan ...
- 数组结构与算法-036-042 前中后缀表达式-逆波兰计算器
036 前缀 中缀 后缀(逆波兰表达式)表达式 前缀表达式 前缀表达式(波兰表达式) 前缀表达式又称波兰表达式,前缀表达式的运算符位于操作数之前 举例说明:(3 + 4) * 5 -6 对应的前缀表达 ...
最新文章
- 史上最完整的人工智能书单大全,学习AI的请收藏好
- node重命名文件名_利用Node.js对文件进行重命名
- maven配置阿里云仓库镜像
- NLP CV ML future
- visual studio 正则表达式 查找与替换文本
- 服务器存储满了进不去系统,解决PC常见问题 篇四十五:建议收藏!手贱升级进不去系统?两步简单恢复黑群晖!...
- win10无限重启服务器,win10系统更新kb4284835补丁失败无限重启的解决方法
- adb 安卓模拟器 进程端口_Android模拟器端口被占用问题的解决办法
- 如何进行PDF页码删除操作 删除页面的技巧有那些
- 1688API详情接口调用展示
- 一辈子不用考试?你可能是个假程序员
- python中判断生肖和星座哪个准_十二生肖PK十二星座,到底哪个更准?
- 删除VSCode 中自定义的snippets
- 通过VBA宏合并Excel工作表
- \t\t无锡联通宽带最新覆盖小区名单?
- c语言编写英语词典软件,C语言课程设计一种简单的英文词典排版系统的实现.doc...
- Life Situation Two
- genus 综合流程
- 三十五年经验分享:程序员进阶八法
- Win7 安装最新版本Process Monitor失败,“无法加载驱动”
热门文章
- python基础知识-一篇文章搞定Python全部基础知识
- python简单程序实例-python实现的简单窗口倒计时界面实例
- 如何系统的自学python-应该怎样系统的学习Python标准库?
- python常用代码总结-Python常用功能函数系列总结(一)
- 语音识别如何处理工作 语音识别功能三个处理阶段
- 语音识别在生活中的七个经典应用
- python安装numpy模块教程_Windows系统中安装Python模块pip numpy matplotlib
- c java互通rsa_C# RSA和Java RSA互通
- 编辑画面,element-ui的单选框组选中值以及画面选择样式无法切换,但是绑定的v-model值已发生变化
- Codeforces Round #753 (Div. 3) C. Minimum Extraction(最小抽离)