将中缀表达式(infix)转换为后缀表达式(postfix)

算法描述

  1. 第一种情况,表达式不含括号。

    假设存在一个函数prcd(op1,op2),其中op1和op2是两个操作符(在中缀表达式中,op1在op2的左边),如果op1的优先级高于或等于op2,函数返回True,否则返回False。例如:

    prcd('\*','+') --> Trueprcd('+','-') --> Trueprcd('\*','/') --> Trueprcd('-','*') --> False
    

    考虑表达式 A+B*C。当扫描到A时,将A添加到postfix中,接着遇到‘+’操作符,此时,由于只有一个操作数,‘+’只能先存入栈stack中;当扫描到B时,将其追加至postfix;接着遇到*,栈不为空,那么调用pcdr(pop(stack),’*’),因为‘+’优先级低于‘*’,返回False,将‘*’压入栈中,push(stack,’*’),接着遇到C,将其追加至postfix。这时,表达式扫描完,栈仍不为空,依次pop出数据,追加至postfix。最终结果为‘BC*A+’

  2. 第二种情况,表达式含有括号。

    当扫描到‘(’时,将其压入堆栈,这可以通过使prcd(op1,'(')对于任何op1都返回False来实现,另外,还定义prcd('(',op2)对于任何op2都返回False,这样一来,‘(’后的所有运算符(除了‘)’)都被压入堆栈
    当扫描到右括号‘)’时,必须将堆栈中运算符都取出来,直到遇到‘(’。这可以通过定义prcd(op1,')')对于所有非左括号的运算符op1返回True来实现。当栈顶元素为左括号时,必须将其取出并和右括号一起作废。

Python实现

    def infix2postfix(exp):postfix = ''stack = []def opOrder(op1,op2):order_dic = {'*':4,'$':5,'/':4,'+':3,'-':3}if op1 == '(' or op2 == '(':return Falseelif op2 == ')':return Trueelse:if order_dic[op1] < order_dic[op2]:return Falseelse:return Truefor s in exp:if s.isalpha():postfix += selse:while len(stack) != 0 and opOrder(stack[-1],s):op = stack.pop()postfix += opif len(stack) == 0 or s != ')':stack.append(s)else:top_op = stack.pop()if len(stack):postfix += ''.join(stack[::-1])return postfixif __name__ == '__main__':for exp in ['A+B*C','(A+B)*C','((A-(B+C))*D)$(E+F)']:print infix2postfix(exp)

运行结果

>>>
ABC*+
AB+C*
ABC+-D*EF+$

[python]将中缀表达式(infix)转换为后缀表达式(postfix)相关推荐

  1. java后缀表达式_表达式计算 java 后缀表达式

    题目: 问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例 ...

  2. java中缀表达式转后缀表达式_数据结构Java实现06----中缀表达式转换为后缀表达式...

    本文主要内容: 表达式的三种形式 中缀表达式与后缀表达式转换算法 一.表达式的三种形式: 中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3.我们从小做数学题时,一直使用的就是中缀表达式. 后 ...

  3. 利用stack结构,将中缀表达式转换为后缀表达式并求值的算法实现

    #!/usr/bin/env python # -*- coding: utf-8 -*-# learn <<Problem Solving with Algorithms and Dat ...

  4. 逆波兰表达式中缀表达式转换为后缀表达式

    中缀表达式转换为后缀表达式 思路分析 代码实现 package com.atguigu.stack;import javax.swing.plaf.nimbus.State; import java. ...

  5. 表达式计算:后缀表达式求解 以及 中缀表达式转换为后缀表达式

    后缀表达式 后缀表达式格式: 不包含括号,运算符放在两个运算对象的后面. 后缀表达式运算规则: (从左向右) 所有计算均按运算符出现的顺序(不再考虑乘除优先于加减这种运算符的优先规则),严格从左向右进 ...

  6. swust oj 1042: 中缀表达式转换为后缀表达式

    题目描述 中缀表达式是一个通用的算术或逻辑公式表示方法,操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法.后缀表达式不包含括号,运算符放在两个运算对象的后面,所 ...

  7. 利用栈将中缀表达式转化成后缀表达式

    目的:将中缀表达式(即标准形式的表达式)转换为后缀式. 例子:a+b*c+(d*e+f)*g转换成abc*+de*f+g*+ 转换原则 1. 遇到操作数, 直接输出 2. 操作符的优先级为 () 最大 ...

  8. NYOJ 257 中缀表达式表示成后缀表达式

    话说这道题代码那个丑陋啊,,写出来我自己都不想再看第二遍啊...看了看聪神的代码,还消耗我3个NYOJ币啊,,更扯得是,聪神的代码我看不懂啊,,,,卧槽...这道题不再多说了,数据结构上有详细的介绍, ...

  9. 栈应用(中缀表达式转后缀表达式并计算后缀表达式的值)

    [0]README 0.1) 本文旨在总结 中缀表达式转后缀表达式并计算后缀表达式的值 的步骤,并给出源代码实现: 0.2) 本文中涉及到的源代码均为原创,是对中缀转后缀和计算后缀的简单实现,(旨在理 ...

最新文章

  1. 《Clojure数据分析秘笈》——2.6节调整词频值的度量
  2. 建立项目接口文档_一个 SpringBoot 项目该包含哪些?
  3. admin登录 404_Shiro Springboot 集群共享Session (Redis)+单用户登录
  4. 滤波器: 滤波器设计软件
  5. MySQL的用户授权
  6. vue 小写金额转换为大写金额
  7. 在c语言中 fb abs是什么,abs()在c语言里表示什么意思?它是库函数吗?
  8. osm地图数据 mysql_GIS 地图数据的来源?
  9. 星巴克与阿里巴巴合作咖啡外卖
  10. 计算机如何连接iphone,iPhone6如何连接到电脑?iPhone6连接到电脑图解教程
  11. 2018甲骨文云大会:如何用“灵全快”抢占市场?
  12. excel表格中18位身份证号码如何转换成出生日期
  13. 用LINQ结合CAML查询 Sharepoint 数据库内容
  14. 零基础开发WIFI设备(esp8266)
  15. 联通物联卡为什么没有网络_物联网卡显示3g 联通物联网
  16. Github创建个人博客
  17. make: *** [ext/fileinfo/libmagic/apprentice.lo] Error 1
  18. Linux如何设置网络唤醒
  19. 深度技术 GHOST XP SP3 快速装机专业版 V2013.03
  20. Excel 检测离群值 Outlier,极端值判断教学

热门文章

  1. 【JavaScript】制作一个抢红包雨页面
  2. 路由器自动选择游戏服务器,教你从头写游戏服务器框架(3)
  3. 计算机ppt怎么播放,【2人回答】如何在PPT中插入一个视频,而在其他电脑也可以播放?-3D溜溜网...
  4. QQ邮箱停运,如何使用网易163邮箱实现邮件发送。
  5. threejs 三面体_用threejs 实现3D物体在浏览器展示
  6. 一款超好用的远程操控工具 ToDesk 免费不限速
  7. Git Bash运行vue create xxx无法使用上下箭头选择
  8. iOS开发(OC)——图片浏览器(本地图片和网络图片都可以用)
  9. 超详细、零基础安装纯净的原版Windows 10系统
  10. SLAM十四讲 第一讲作业 附加题:ORB-SLAM2