前缀、中缀、后缀表达式(逆波兰表达式)

本文转自https://www.cnblogs.com/chensongxian/p/7059802.html

介绍

前缀表达式、中缀表达式、后缀表达式都是四则运算的表达方式,用以四则运算表达式求值
,即数学表达式的求职

中缀表达式

简介

中缀表达式就是常见的运算表达式,如(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栈顶运算符的优先级
    1. 如果s1为空,或栈顶运算符为右括号“)”,则直接将此运算符入栈
    2. 否则,若优先级比栈顶运算符的较高或相等,也将运算符压入s1
    3. 否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4-1)与s1中新的栈顶运算符相比较
  5. 遇到括号时
    1. 如果是右括号“)”,则直接压入s1
    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 -) 数字直接入栈
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 -”

  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栈顶运算符的优先级:
    1. 如果s1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈;
    2. 否则,若优先级比栈顶运算符的高,也将运算符压入s1(注意转换为前缀表达式时是优先级较高或相同,而这里则不包括相同的情况);
    3. 否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4-1)与s1中新的栈顶运算符相比较;
  5. 遇到括号时:
    1. 如果是左括号“(”,则直接压入s1;
    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 -”

前缀(波兰表达式) 中缀 后缀(逆波兰表达式)相关推荐

  1. 中缀表达式转换成逆波兰式

    栈的应用:中缀表达式转换成逆波兰式 小白前来报道!懒癌患者的第一篇博客,实属不易,先为自己鼓个掌. 编写程序,将任意一个合法的中缀表达式转换成逆波兰式. [问题描述]表达式计算是实现程序设计语言的基本 ...

  2. 将表达式转换成逆波兰式

    http://www.cnblogs.com/stay-foolish/archive/2012/04/25/2470590.html 假设表达式由单字母变量和双目四则运 算算符构成.试写一个算法,将 ...

  3. 设计一个算法,将一般算术表达式转化为逆波兰表达式,并求逆波兰表达式的值

    栈的设计与使用 实验内容 设计一个算法,将一般算术表达式转化为逆波兰表达式,并求逆波兰表达的值 解题思路 (1)一般算术表达(中缀表达),如#3×(4+2)/2-5#,#为表达式界定符,逆波兰表达式( ...

  4. php逆波兰表达式,PHP实现逆波兰式 - 计算工资时用

    近期一个小项目需要用到公式运算, 所以就进行一些了解,以下内容均属于个人经验. 在PHP中实现公式表达式四则运算大概有两种方法: 1)使用系统函数eval 2)将表达式转换成逆波兰表达式进行计算. / ...

  5. 编译原理逆波兰式实验java_逆波兰式算法的编译原理实验过程.doc

    逆波兰式算法的编译原理实验过程 实验目的 深入理解算符优先分析法 掌握FirstVt和LastVt集合的求法有算符优先关系表的求法 掌握利用算符优先分析法完成中缀表达式到逆波兰式的转化 实验内容及要求 ...

  6. NPI (Neural Program Interpreter) 逆波兰表达式--什么是逆波兰表达式

    打算详细的写一下NPI, 感觉这个蛮帅的.第一篇就先介绍一下要解决的问题了. 中置表达式与逆波兰 "先算乘除,再算加减,最先算括号",这是数学老师告诉我们的用来解决表达式的口诀,可 ...

  7. php 逆波兰 if,什么是逆波兰式?

    逆波兰式的英文全称是"Reverse Polish notation",也叫后缀表达式,逆波兰式在计算机看来是比较简单易懂的结构,因为计算机普遍采用的内存结构是栈式结构,它执行先进 ...

  8. 波兰表示法与逆波兰表示法

    身为初学者,能力有限,知识尚少,如有纰漏,还望海涵.   对于表达式,通常有三种表示方法,前.中.后缀表示法.我们日常使用的数学算式就是中缀表示法.例:1+5*10-10/2 码文不易,希望支持,谢谢 ...

  9. JAVA实现逆波兰转换,java实现逆波兰式

    package com.yj.rpn; import java.util.*; import java.util.logging.StreamHandler; /** * Created by yan ...

  10. 数组结构与算法-036-042 前中后缀表达式-逆波兰计算器

    036 前缀 中缀 后缀(逆波兰表达式)表达式 前缀表达式 前缀表达式(波兰表达式) 前缀表达式又称波兰表达式,前缀表达式的运算符位于操作数之前 举例说明:(3 + 4) * 5 -6 对应的前缀表达 ...

最新文章

  1. 史上最完整的人工智能书单大全,学习AI的请收藏好
  2. node重命名文件名_利用Node.js对文件进行重命名
  3. maven配置阿里云仓库镜像
  4. NLP CV ML future
  5. visual studio 正则表达式 查找与替换文本
  6. 服务器存储满了进不去系统,解决PC常见问题 篇四十五:建议收藏!手贱升级进不去系统?两步简单恢复黑群晖!...
  7. win10无限重启服务器,win10系统更新kb4284835补丁失败无限重启的解决方法
  8. adb 安卓模拟器 进程端口_Android模拟器端口被占用问题的解决办法
  9. 如何进行PDF页码删除操作 删除页面的技巧有那些
  10. 1688API详情接口调用展示
  11. 一辈子不用考试?你可能是个假程序员
  12. python中判断生肖和星座哪个准_十二生肖PK十二星座,到底哪个更准?
  13. 删除VSCode 中自定义的snippets
  14. 通过VBA宏合并Excel工作表
  15. \t\t无锡联通宽带最新覆盖小区名单?
  16. c语言编写英语词典软件,C语言课程设计一种简单的英文词典排版系统的实现.doc...
  17. Life Situation Two
  18. genus 综合流程
  19. 三十五年经验分享:程序员进阶八法
  20. Win7 安装最新版本Process Monitor失败,“无法加载驱动”

热门文章

  1. python基础知识-一篇文章搞定Python全部基础知识
  2. python简单程序实例-python实现的简单窗口倒计时界面实例
  3. 如何系统的自学python-应该怎样系统的学习Python标准库?
  4. python常用代码总结-Python常用功能函数系列总结(一)
  5. 语音识别如何处理工作 语音识别功能三个处理阶段
  6. 语音识别在生活中的七个经典应用
  7. python安装numpy模块教程_Windows系统中安装Python模块pip numpy matplotlib
  8. c java互通rsa_C# RSA和Java RSA互通
  9. 编辑画面,element-ui的单选框组选中值以及画面选择样式无法切换,但是绑定的v-model值已发生变化
  10. Codeforces Round #753 (Div. 3) C. Minimum Extraction(最小抽离)