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

前缀表达式称为波兰表达式,前缀表达式的运算符位于操作符之前

举例说明:(3+4)x 5 – 6 对应的前缀表达式就是- X + 3 4 5 6

中缀表达式转为后缀表达式:

具体步骤:(注意括号不算运算符)

  1. 初始化两个栈,其中运算符栈s1和存储中间结果的栈s2
  2. 从左到右进行扫描中缀表达式
  3. 遇到操作符将其压进s2
  4. 遇到运算符,比较其与s1栈顶运算符的优先级:
  1. 如果s1为空,或者栈顶运算符为左括号,则直接将此运算符压进栈中
  2. 否则,若优先级比栈顶运算符的高,也将运算符压入s1
  3. 否则,将s1栈顶的运算符弹出并压入到s2中,再次转到第一小步中与s1中新的栈顶运算符相比较。

5.遇到括号时:

  1. 如果是左括号,直接压入s1中
  2. 如果是有括号,则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃

6. 重复步骤2至5,直到表达是的最右边

7. 将s1中剩余的运算符依次弹出并压入s2

8. 依次弹出s2中的元素并输出,结果的逆序即中缀表达式对应的后缀表达式


# 中缀表达式 --->  后缀表达式
# 1 + ((2+3)*4) - 5 ---->  1 2 3 + 4 * + 5 -class ArrayStack2:def __init__(self,masSize):self.maxsize = masSizeself.stack = []self.top = -1# 判断栈是不是 满的def isFull(self):return self.top == self.maxsize - 1# 判断栈是不是空的def isEmpty(self):return self.top == -1# 将数据压入栈中def push(self,value):if self.isFull():print("栈已经满了!")returnself.top = self.top + 1self.stack.append(value)# 将栈中的数据进行删除def pop(self):if self.isEmpty():print("栈已经是空的了,没法执行出栈操作!")returnvalue = self.stack.pop()self.top = self.top - 1return value# 显示栈的内容,需要先从栈顶显示数据def showStack(self):if self.isEmpty():print("栈已经是空的了,没法执行显示操作!")returni = self.topwhile i > -1:print("栈中存在的数据:",self.stack[i])i = i -1# 返回运算法的优先级  有程序员决定  优先级使用数字来表示,数字越大优先级越高def priority(self,oper):if (oper == "*" or oper == "/"):return 1elif (oper == "+" or oper == "-"):return 0else:return -1# 判断是不是一个运算法def isOper(self,val):return val == "*" or val == "/" or val == "+" or val =="-"def isyunsuan(self,val):return val == "(" or val == ")"# 进行计算def cal(self,num1,num2,oper):if oper == "+":return num1 + num2elif oper == "-":return num2 - num1 # 注意顺序elif oper == "*":return num1 * num2elif oper == "/":return num2 / num1# 只返回最后的一个元素,但是并不是删除最后 一个元素def peek(self):return self.stack[self.top]class Infixtohouzhui:def __init__(self,expression = "1+((2+3)*4)-5"):self.expression = expressionself.s1 = ArrayStack2(20)self.s2 = []  # 直接使用list比较好self.flag = 0self.index = 0self.data = 1self.keepnum = 0def change(self):while self.index <= len(self.expression) - 1:if self.s1.isOper(self.expression[self.index]) == False and self.s1.isyunsuan(self.expression[self.index]) == False:self.keepnum = self.expression[self.index]while True:if self.index + self.data <= len(self.expression) - 1:if (self.s1.isOper(self.expression[self.index + self.data])) == False and self.s1.isyunsuan(self.expression[self.index + self.data]) == False:self.flag = 1self.keepnum = self.keepnum + self.expression[self.index+self.data]self.data = self.data + 1else:breakelse:breakself.s2.append(self.keepnum)self.keepnum = ""elif self.expression[self.index] == "(":self.s1.push(self.expression[self.index])# 如果是有括号,就将s1中的运算符,压到s2中,知道遇到左括号为止elif (self.expression[self.index]) == ")":while (self.s1.peek())!="(":self.s2.append(self.s1.pop())self.s1.pop() # 将s1中的左括号要删除掉else:# 当s1的栈顶运算符大于新来的运算符 将s1的栈顶运算符放到s2中,然后不停的比较while (self.s1.isEmpty() == False and self.s1.priority(self.s1.peek())>=self.s1.priority(self.expression[self.index])):self.s2.append(self.s1.pop())self.s1.push(self.expression[self.index])if self.flag:self.index = self.index + self.dataself.flag = 0self.data = 1else:self.index = self.index + 1while self.s1.isEmpty() == False:self.s2.append(self.s1.pop())return self.s2if __name__ == '__main__':ll = Infixtohouzhui()print(ll.change())

python实现中缀表达式转后缀表达式相关推荐

  1. Python 中缀表达式转换后缀表达式

    实现一个可以处理加减乘数运算的中缀表达式转换后缀表达式的程序: 一个输入中缀表达式inOrder 一个输出池pool 一个缓存栈stack 从前至后逐字读取inOrder 首先看一下不包含括号的: ( ...

  2. python中缀转后缀_中缀表达式转后缀表达式Python

    中缀表达式转后缀表达式参考的文章就是直接给出了算法,但是算法如何推导出来的还没有弄明白,简单记录下我自己的理解,强行解释一下. 后缀表达式就是操作符再操作数的后面,并且计算机能够根据简单的优先级就能进 ...

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

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

  4. java中缀表达式转后缀表达式(逆波兰算法)

    四则运算是栈的重要应用之一 中缀表达式转后缀表达式(逆波兰算法)过程 从左到右遍历中缀表达式 数字直接输出为后缀表达式一部分 如果是符号,则判断与栈顶元素的优先级 高于栈顶元素优先级直接入栈 低于或等 ...

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

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

  6. 数据结构实验——中缀表达式转为后缀表达式

    一.实验内容: 编写程序,实现中缀表达式化为后缀式输出. 已知中缀表达式中操作数全部用小写英文字母表示,运算符只含有+, -, *, /四种,定界符只有( )以及结束符#. 二.程序源代码: 运行示例 ...

  7. 九、中缀表达式转为后缀表达式

    使用栈将中缀表达式转为后缀表达式并计算 一.中缀表达式转换为后缀表达式 由于后缀表达式适合计算式进行计算,但是人对于较长的中缀表达式,很难将中缀表达式直接转换为后缀表达式,于是我们使用栈来实现中缀表达 ...

  8. 数据结构——栈——中缀表达式和后缀表达式

    什么是中缀表达式,什么是后缀表达式 我们一般看见的多项式计算都是中缀表达式构成的:1+2*3+4/3 类似这种,为什么说是中缀呢?因为它的计算符号都是在两个数中间的. 那么自然而然的明白了后缀表达式是 ...

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

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

最新文章

  1. 可以检验计算机配置的游戏软件,检测游戏配置的软件-有没有自己检验电脑配置是否符合游戏要求配置 – 手机爱问...
  2. 异步爬虫框架与协程浅析
  3. 真 · 圆桌!WAIC论坛上演自动驾驶专家激辩,直面技术路径之争
  4. docker 报错 non-overlapping IPv4 address pool among the defaults to assign to the network 解决方法
  5. Linux2.6内核--中断线被关闭的情况
  6. php无法加载Memcache缓存模块问题及Memcache的安装
  7. linux讲日志暂停,linux – Rsyslog在日志轮换后停止向远程服务器发送数据
  8. 外星人台式电脑_戴尔 XPS 和外星人大更新,一边是生产力,一边是游戏
  9. 一键生成人脸像素图,还能上传到动森!这个项目很好玩
  10. python把空格替换成字符串,用空格替换字符串中的字符
  11. 服务器命令压缩文件,使用linux的zip命令压缩文件
  12. 微信公众号查后端服务器IP,微信公众号平台接口开发 获取微信服务器IP地址方法解析...
  13. 【短时幅度谱】短时幅度谱估计在语音增强方面的MATLAB仿真
  14. 欧洲杯赛场“中国元素”引观众热议;万达两家酒店在延安红街开业窑洞房最具特色 | 美通社头条...
  15. 一份热乎乎的字节面试真题
  16. 缺陷预防-我认为的质量改进正道之光
  17. C#将数据导入固定word模板
  18. 【ESP 保姆级教程】玩转emqx认证篇③ ——认证安全之使用 MySQL 的密码认证
  19. signature=c4909c704a84f06fbd526ac646c599dd,각변위 방식을 이용한 캡슐의 오리엔테이션 측정 방법...
  20. 根据当前行情,计算历史上与当前最相似的行情python实现

热门文章

  1. Linux查看用户及其权限管理
  2. java学习出师_零基础学java来这里 出师如此简单
  3. 2.VM虚拟机网络设置---NAT模式
  4. nginx网站服务器的版本号,隐藏nginx版本号的两种方法
  5. Android使用LAME将pcm文件转mp3文件
  6. ByteBuf使用实例
  7. 【Swift】LeedCode Nim 游戏
  8. Ubuntu虚拟机设置共享文件夹
  9. CocosCreator之KUOKUO趣味文章:小怪的诞生 1
  10. java ws协议_基于java实现websocket协议过程详解