它们都是对表达式的记法,因此也被称为前缀记法、中缀记法和后缀记法。它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前;中缀和后缀同理。

举例:
(3 + 4) × 5 - 6 就是中缀表达式
- × + 3 4 5 6 前缀表达式
3 4 + 5 × 6 - 后缀表达式

中缀表达式(中缀记法)
中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间。中缀表达式是人们常用的算术表示方法。
虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值。对计算机来说,计算前缀或后缀表达式的值非常简单。

前缀表达式(前缀记法、波兰式)
前缀表达式的运算符位于操作数之前。

前缀表达式的计算机求值:
从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 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,由此得出最终结果。
可以看出,用计算机计算前缀表达式的值是很容易的。

将中缀表达式转换为前缀表达式:
遵循以下步骤:
(1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2;
(2) 从右至左扫描中缀表达式;
(3) 遇到操作数时,将其压入S2;
(4) 遇到运算符时,比较其与S1栈顶运算符的优先级:
(4-1) 如果S1为空,或栈顶运算符为右括号“)”,则直接将此运算符入栈;
(4-2) 否则,若优先级比栈顶运算符的较高或相等,也将运算符压入S1;
(4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较;
(5) 遇到括号时:
(5-1) 如果是右括号“)”,则直接压入S1;
(5-2) 如果是左括号“(”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到右括号为止,此时将这一对括号丢弃;
(6) 重复步骤(2)至(5),直到表达式的最左边;
(7) 将S1中剩余的运算符依次弹出并压入S2;
(8) 依次弹出S2中的元素并输出,结果即为中缀表达式对应的前缀表达式。
例如,将中缀表达式“1+((2+3)×4)-5”转换为前缀表达式的过程如下:

扫描到的元素 S2(栈底->栈顶) S1 (栈底->栈顶) 说明
5 5 数字,直接入栈
- 5 - S1为空,运算符直接入栈
) 5 - ) 右括号直接入栈
4 5 4 - ) 数字直接入栈
× 5 4 - ) × S1栈顶是右括号,直接入栈
) 5 4 - ) × ) 右括号直接入栈
3 5 4 3 - ) × ) 数字
+ 5 4 3 - ) × ) + S1栈顶是右括号,直接入栈
2 5 4 3 2 - ) × ) + 数字
( 5 4 3 2 + - ) × 左括号,弹出运算符直至遇到右括号
( 5 4 3 2 + × - 同上
+ 5 4 3 2 + × - + 优先级与-相同,入栈
1 5 4 3 2 + × 1 - + 数字
到达最左端 5 4 3 2 + × 1 + - S1中剩余的运算符

因此结果为“- + 1 × + 2 3 4 5”。

后缀表达式(后缀记法、逆波兰式)
后缀表达式与前缀表达式类似,只是运算符位于操作数之后。

后缀表达式的计算机求值:
与前缀表达式类似,只是顺序是从左至右:
从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 op 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果。
例如后缀表达式“3 4 + 5 × 6 -”:
(1) 从左至右扫描,将3和4压入堆栈;
(2) 遇到+运算符,因此弹出4和3(4为栈顶元素,3为次顶元素,注意与前缀表达式做比较),计算出3+4的值,得7,再将7入栈;
(3) 将5入栈;
(4) 接下来是×运算符,因此弹出5和7,计算出7×5=35,将35入栈;
(5) 将6入栈;
(6) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。

将中缀表达式转换为后缀表达式:
与转换为前缀表达式相似,遵循以下步骤:
(1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2;
(2) 从左至右扫描中缀表达式;
(3) 遇到操作数时,将其压入S2;
(4) 遇到运算符时,比较其与S1栈顶运算符的优先级:
(4-1) 如果S1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈;
(4-2) 否则,若优先级比栈顶运算符的高,也将运算符压入S1(注意转换为前缀表达式时是优先级较高或相同,而这里则不包括相同的情况);
(4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较;
(5) 遇到括号时:
(5-1) 如果是左括号“(”,则直接压入S1;
(5-2) 如果是右括号“)”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到左括号为止,此时将这一对括号丢弃;
(6) 重复步骤(2)至(5),直到表达式的最右边;
(7) 将S1中剩余的运算符依次弹出并压入S2;
(8) 依次弹出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.java3z.com/cwbwebhome/article/article8/83542.html?id=4612

中缀表达式转换成前缀表达式和后缀表达式的极其简单方法

35,15,+,80,70,-,*,20,/               //后缀表达方式

(((35+15)*(80-70))/20)=25           //中缀表达方式

/,*,+,35,15,-,80,70, 20             //前缀表达方式

人的思维方式很容易固定~~!正如习惯拉10进制。就对2,3,4,8,16
等进制不知所措一样~~!

人们习惯的运算方式是中缀表达式。而碰到前缀,后缀方式。。迷茫
其实仅仅是一种表达式子的方式而已(不被你习惯的方式)
我这里教你一种也许你老师都没跟你讲的简单转换方式

一个中缀式到其他式子的转换方法~~
这里我给出一个中缀表达式~
a+b*c-(d+e)
第一步:按照运算符的优先级对所有的运算单位加括号~
        式子变成拉:((a+(b*c))-(d+e))
第二步:转换前缀与后缀表达式
        前缀:把运算符号移动到对应的括号前面
              则变成拉:-( +(a *(bc)) +(de))
              把括号去掉:-+a*bc+de  前缀式子出现
        后缀:把运算符号移动到对应的括号后面
              则变成拉:((a(bc)* )- (de)+ )-
              把括号去掉:abc*-de+-  后缀式子出现
发现没有,前缀式,后缀式是不需要用括号来进行优先级的确定的。

如果你习惯拉他的运算方法。计算的时候也就是从两个操作数的前面
或者后面找运算符。而不是中间找,那么也就直接可以口算拉

转自:http://blog.csdn.net/glldc/article/details/1818787

中缀表达式转换为前缀及后缀表达式并求值【摘】相关推荐

  1. 中缀表达式转换为前缀或后缀表达式的手工做法

    以 a/b + ( c*d - e*f) / g 为例: 步骤1:按照运算符的优先级对所有的运算单元加括号. ((a/b) + (( (c*d) - (e*f)) / g)) 步骤2:转换为前缀或后缀 ...

  2. 中缀表达式转换为前缀表达式(lisp实现)

    使用weight.opcode和infix_to_prefix三个函数实现中缀表达式到前缀表达式的转换. 算符优先级函数weight 首先定义函数weight,它返回一个算术运算符(可简称为算符)的优 ...

  3. 中缀、前缀和后缀表达式

    逆波兰表达式 先说一下中缀表达式,平时我们使用的运算表达式就是中缀表达式,例如1+3*2,中缀表达式的特点就是:二元运算符总是置于与之相关的两个运算对象之间 人读起来比较好理解,但是计算机处理起来就很 ...

  4. java求值不用后缀表达式_数据结构之后缀表达式求值(java实现)

    数据结构之后缀表达式求值(java实现) 前记 ​ 今天在刷leet code的时候刷到了一道题,后缀表达式(逆波兰表达式)求值,我花了一会儿写了一下它的解法.但是今天我不谈什么是后缀表达式,有兴趣的 ...

  5. 求解算术表达式结合二叉树的后缀表达式问题

    题目 算术表达式a+b*(c+d/e)转为后缀表达式后为? 1.画一个运算树 先算d/e,根为"/",左右子结点分别为d,e: 然后算c+d/e,根为"+",左 ...

  6. mysql为字段值添加或者去除前缀、后缀(查询字段拼值)

    添加前缀update `ecs_goods` set goods_name=concat('新中式',goods_name) where cat_id =4; 添加后缀update `ecs_good ...

  7. 前缀、中缀、后缀表达式(转载)

    关键字:概念, 前缀表达式, 前缀记法, 中缀表达式, 中缀记法, 波兰式, 后缀表达式, 后缀记法, 逆波兰式 它们都是对表达式的记法,因此也被称为前缀记法.中缀记法和后缀记法.它们之间的区别在于运 ...

  8. 前缀、中缀、后缀表达式及其相互转化的Java实现

    一.中缀表达式转换为前缀.后缀表达式 给个中缀表达式:a+b*c-(d+e) 首先根据运算符的优先级给所有运算单位加括号:((a+(b*c))-(d+e)) 将运算符号移动到对应括号的前面然后去掉所有 ...

  9. 前缀、中缀和后缀表达式详解,中缀表达式到后缀表达式的转换规则,以及后缀表达式的计算规则,附计算代码

    1. 中缀.前缀和后缀表达式 1.1 中缀表达式 首先,中缀表达式的这个"缀"指运算符在两个操作数的位置.中缀表达式其实就是我们常用的算术表达式,比如 2 + 9 - (32 * ...

最新文章

  1. OpenCV On Android
  2. 过椭圆外一点引两条切线方程_椭圆的一些结论汇总
  3. OSI七层模型加协议
  4. android studio 显示方法列表,有没有办法在Android Studio编辑器中显示RecyclerView内容的预览?...
  5. MT6580启动流程
  6. 通信原理实验c语言,基于LabVIEW软件的通信原理实验教学平台设计方案
  7. 利用ssh穿越多个跳板机最简单最高效的办法
  8. 第三节 UNIX文件系统结构
  9. 反编译工具Reflector下载(集成两个常用.net插件,FileGenerator和FileDisassembler)
  10. python xy 2.7下载_pythonxy 安装
  11. 最常用的scrum工具、敏捷开发工具、看板工具
  12. Nginx灰度升级实现说明
  13. php 简明现代魔法,【转】WinCacheGrind配合XDebug分析PHP程序性能 — 简明现代魔法...
  14. 利用opencv带你玩转人脸识别-上篇(读取图片,灰度转换,尺寸修改,绘制矩形快速入门)
  15. 调试服务器用便携显示器,再也不用担心出门没游戏玩了-------自制HORI便携显示器 (试做版)...
  16. GSMA宣布了首批2017世界移动大会-上海主题演讲嘉宾名单
  17. 民锋国际期货:2023年USDA农业展望论坛
  18. salmon的报错解决error while loading shared libraries: libboost_iostreams.so.1.60.0
  19. How many times rampant Warcraft Star players ah
  20. 安卓盒子装mysql_IT入门必备 篇二:安卓盒子改造六核web服务器

热门文章

  1. DEDE 会员调用方法详解
  2. python量化数据处理小细节(以后还会不断补充)
  3. 17--合并两个有序数组
  4. Ubuntu中安装、生成、导入、导出、Python3虚拟环境
  5. gitlab修改用户密码_CRM用户模块(用户密码修改)
  6. kafka tool 查看指定group下topic的堆积数量_ELK架构下利用Kafka Group实现Logstash的高可用...
  7. 模拟银行自动提款系统python
  8. pytorch神经网络因素预测_实战:使用PyTorch构建神经网络进行房价预测
  9. 平衡小车卡尔曼滤波算法
  10. DebugView的使用[通用汇总]