算术表达式的前缀式、中缀式、后缀式相互转换
中缀表达式(中缀记法)
中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间。中缀表达式是人们常用的算术表示方法。
虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值。对计算机来说,计算前缀或后缀表达式的值非常简单。
前缀表达式(前缀记法、波兰式)
前缀表达式的运算符位于操作数之前。
前缀表达式的计算机求值:
从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。
例如前缀表达式“- × + 3 4 5 6”:
(1) 从右至左扫描,将6、5、4、3压入堆栈;
(2) 遇到+运算符,因此弹出3和4(3为栈顶元素,4为次顶元素,注意与后缀表达式做比较),计算出3+4的值,得7,再将7入栈;
(3) 接下来是×运算符,因此弹出7和5,计算出7×5=35,将35入栈;
(4) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。
可以看出,用计算机计算前缀表达式的值是很容易的。
详细解释:http://blog.csdn.net/antineutrino/article/details/6763722/
给出一个中缀表达式如下:
a+b*c-(d+e)
第一步:按照运算符的优先级对所有的运算单位加括号,
式子变成了:((a+(b*c))-(d+e))
第二步:转换前缀与后缀表达式
前缀:把运算符号移动到对应的括号前面
则变成了:-( +(a *(bc)) +(de))
把括号去掉:-+a*bc+de 前缀式子出现
后缀:把运算符号移动到对应的括号后面
则变成了:((a(bc)* )+ (de)+ )-
把括号去掉:abc*+de+- 后缀式子出现
<1> 将中缀表达式“1+((2+3)*4)-5”转换为前缀表达式。
(1)构建两个栈,一个存运算符一个存操作数。运算符(以括号分界点)在栈内遵循越往栈顶优先级不降低的原则排序。
(2)从右往左扫描中缀式表达式,从右边第一个字符开始判断。
如果当前字符是数字,则分配到数字串的结尾并将数字串直接输出。
如果是运算符,则比较优先级。如果当前运算符的优先级大于等于栈顶运算符的优先级(当栈顶是括号时,直接入栈),则将运算符直接入栈;否则将栈顶运 算符出栈并输出,直到当前运算符的优先级大于等于栈顶运算符的优先级(当栈顶元素是括号直接入栈),再将当前运算符入栈。如果是括号,则根据括号的 方向进行处理。如果是括号直接入栈;否则,遇右括号前将所有的运算符全部出栈并输出,遇右括号后将左右的两括号一起删除。
(3)重复上述操作(2)直至扫描结束,将栈内剩余运算符全部出栈并输出,再将缀输出字符串。中缀表达式就变成了前缀表达式了。
中缀表达式
|
前缀表达式
|
(栈顶)运算符栈(栈尾)
|
说明
|
5
|
5
|
空
|
5,是数字串直接输出
|
-
|
5
|
-
|
-,栈内无运算符,直接入栈
|
)
|
5
|
-)
|
),直接入栈
|
4
|
5 4
|
-)
|
4,是数字串直接输出
|
*
|
5 4
|
-)*
|
*,栈顶是括号,直接入栈
|
)
|
5 4
|
- ) * )
|
),直接入栈
|
3
|
5 4 3
|
- ) * )
|
3,是数字串直接输出
|
+
|
5 4 3
|
- ) * ) +
|
+,栈顶是括号,直接入栈
|
2
|
5 4 3 2
|
- ) * )+
|
2,是数字串直接输出
|
(
|
5 4 3 2+
|
- ) *
|
(,
|
(
|
5 4 3 2+*
|
-
|
(,
|
+
|
5 4 3 2+*
|
-+
|
+,优先级大于等于栈顶运算符,直接入栈
|
1
|
5 4 3 2+*1
|
-+
|
1,是数字串直接输出
|
空
|
5 4 3 2+*1+-
|
空
|
扫描结束,将栈内剩余运算符全部出栈并输出
|
空
|
- + 1 * + 2 3 4 5
|
空
|
逆缀输出字符串
|
【2】中缀表达式转换为后缀表达式
过程和【1】差不多,只不过是从左往右扫描,方向换了一个,其他一样。
还是这个式子:1+((2+3)*4)-5
中缀表达式
|
后缀表达式
|
(栈顶)运算符栈(栈尾)
|
说明
|
1
|
1
|
空
|
1,是数字串直接输出
|
+
|
1
|
+
|
+,栈内无运算符,直接入栈
|
(
|
1
|
+(
|
(,直接入栈
|
(
|
1
|
+((
|
(,直接入栈
|
2
|
1 2
|
+((
|
2 ,数字
|
+
|
1 2
|
+((+
|
+,直接入栈
|
3
|
1 2 3
|
+((+
|
3,是数字串直接输出
|
)
|
1 2 3 +
|
+(
|
碰到 )找到(之前所有符号弹出出
|
*
|
1 2 3 +
|
+(*
|
*
|
4
|
1 2 3 + 4
|
+(*
|
4
|
)
|
1 2 3 + 4 *
|
+
|
碰到 )找到(之前所有符号弹出出
|
-
|
1 2 3 + 4 *
|
+ -
|
-
|
5
|
1 2 3 + 4 *5
|
+ -
|
5
|
空
|
1 2 3 + 4 *5 - +
|
空
|
扫描结束
|
空
|
1 2 3 + 4 *5 - +
|
空
|
逆缀输出字符串
|
后缀表达式逆向求解中缀表达式
算术表达式的前缀式、中缀式、后缀式相互转换相关推荐
- 栈的三种表达式(前缀、中缀、后缀)
前缀表达式(波兰表达式) 即是所有运算符在操作数前面. 前缀表达式的计算机求值过程 1.计算机从右至左进行扫描 2.遇到数字,将数字压入数栈:遇到符号,则弹出数栈中的栈顶和次顶的两个数字(栈顶(运算符 ...
- 数据结构 - 栈 (逆波兰计算器)(栈的三种表达式)(前缀、中缀和后缀表达式,后缀也叫逆波兰表达式)(中缀表达式转后缀表达式实现步骤及完整代码)
栈的三种表达式:前缀.中缀和后缀表达式,后缀也叫逆波兰表达式 前缀(波兰表达式) 中缀(对人来讲很好理解,对于计算机来讲就方便了,一般会把中缀表达式转换成后缀表达式) 后缀(逆波兰表达式) 计算过程 ...
- 使用栈解决的一类经典问题:表达式转换及求值;中缀表达式;前缀表达式,后缀表达式,中缀转前缀;中缀转后缀;后缀表达式求值;波兰式,逆波兰式
文章目录 背景知识 表达式转换问题(考研经典) 一:手工转换 (1)中缀转前缀和中缀转后缀 (2)前缀转中缀和后缀转中缀 二:用栈实现表达式转换 (1)中缀转后缀 (2)中缀转前缀 表达式计算问题(使 ...
- 前缀、中缀、后缀表达式详解
前缀.中缀.后缀表达式详解 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 介绍 前缀.中缀.后缀表达式是对表达式的不同记法,其 ...
- Java数据结构和算法(六)——前缀、中缀、后缀表达式
前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...
- 一行文章让你搞懂什么是前缀、中缀、后缀表达式以及它们之间的相互转换
一.什么前缀.中缀.后缀表达式(使用 8*(5+6)-1的例子) 1.中缀表达式:8*(5+6)-1:(也就是我们平常所见的运算式) 2.后缀表达式:8 5 6 + * 1 - :计算机是怎么运算的呢 ...
- (王道408考研数据结构)第三章栈和队列-第三节1:栈的应用之括号匹配问题和表达式问题(前缀、中缀和后缀)
前面我们就说过,栈是一种先进后出的线性表,这种先进后出的特性就决定了它在一类场合或问题中会经常被用到--递归.考研数据结构中所涉及的利用栈结构解决递归问题或者考察栈结构特性的问题主要有这么几类 括号匹 ...
- 前缀、中缀、后缀表达式(转载)
关键字:概念, 前缀表达式, 前缀记法, 中缀表达式, 中缀记法, 波兰式, 后缀表达式, 后缀记法, 逆波兰式 它们都是对表达式的记法,因此也被称为前缀记法.中缀记法和后缀记法.它们之间的区别在于运 ...
- 前缀、中缀和后缀表达式详解,中缀表达式到后缀表达式的转换规则,以及后缀表达式的计算规则,附计算代码
1. 中缀.前缀和后缀表达式 1.1 中缀表达式 首先,中缀表达式的这个"缀"指运算符在两个操作数的位置.中缀表达式其实就是我们常用的算术表达式,比如 2 + 9 - (32 * ...
最新文章
- 哪些品牌开始连接鸿蒙系统,华为鸿蒙系统硬件生态品牌升级为 HarmonyOS Connect
- ThinkPHP快捷方法使用总结
- mysql ft_mysql全文索引____ft_min_word_len
- OpenCASCADE:使用扩展数据交换 XDE之读写 STEP 或 IGES
- spring-quartz
- 43 MM配置-采购-条件-定价过程-定义存取顺序
- 6001. mavlink 编译与移植
- RHEL6.3 NFS服务搭建过程详解
- Ctftool:CTF漏洞利用工具
- IE7IE8不支持rgba的方法
- 公用计算机打不开扫雷,win7系统“扫雷”游戏无法打开问题的处理方法
- Unity 游戏资源更新之——AB包
- 一个学习C语言的好网站,推荐给大家
- 电脑桌面计算机图标下不显示文字,电脑桌面图标下面的文字有时会突然不见,然后 – 手机爱问...
- Illegal base64 character 20
- MATLAB在数学建模中的应用
- 北京大学肖臻老师《区块链技术与应用》ETH笔记 - 3.0 ETH数据结构篇
- 2020-10-17
- Linux 信号学习
- 定义一个类,提供显示圆的周长的方法,提供显示圆的面积的方法
热门文章
- 历年高考报考人数和录取人数
- centos6安装mysql并远程连接_MySQL5.7数据库安装与远程连接
- 467python教程_Magnus Lie Hetland的《Python基础教程(第3版)》自学笔记(持续更新中)...
- sqlserver如何从周一计算周_纯零基础,花10周时间,完全搞定Python,有没有可能?...
- php无法连接mysql_php无法连接数据库
- c++回到起点旅行商问题_不要犯同样的错,提C型房车回渝上牌长途旅行的心路历程...
- python selenium采集速卖通_2.不苟的爬虫小教程系列:python爬虫技术栈介绍
- java泰拉轴距_Java面向对象
- c语言降序多项式加法,数据结构算法(多项式加法)的C语言完美实现
- oracle笔试题目及答案,Oracle 笔试题目带答案.doc