逆波兰表达式求解一般是基于堆栈的,求解过程是:操作数入栈,遇到操作符时,操作数出栈,求值,将结果入栈;运行一遍后,栈顶就是表达式的值。因此逆波兰表达式的求值使用堆栈结构很容易实现,并且能很快求值。
比如:中缀表达式“5 + ((1 + 2) * 4) - 3”写作“5 1 2 + 4 * + 3 -”。
下面给出了该逆波兰表达式从左至右求值的过程,堆-栈栏给出了中间值,用于跟踪算法。

计算完成时,栈内只有一个操作数,这就是表达式的结果:14


```python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#2-9-3.py
import redef updateStack(computeStr,s1,s2,opsPriority):m=re.search(r'^(\D+?)',computeStr)    strType=''if m:strType='operator'else:m=re.search(r'^(\d*\.?\d*)',computeStr)strType='num'splitWord=m.groups()if strType=='operator':if len(splitWord[0])>0:operator=splitWord[0]if operator not in ('(',')'):while len(s1)>0:if opsPriority[s1[-1]]<opsPriority[operator]:s1.append(operator)breakelse:s2.append(s1.pop())elif operator=='(':s1.append(operator)elif operator==')':while len(s1)>0:getOpt=s1.pop()if getOpt=='(':breakelse:s2.append(getOpt)else:s2.append(float(splitWord[0]))return (m.start(),m.end())def clearStack(s1,s2):while len(s1)>1:s2.append(s1.pop())center_computer=[r"11+3*7-9/3",r"(1+3)*(1+9)+16/(4*2)",r"(11+32.61)/8*66/6",r"(11+32.61)/(8*66)"]
operatorsPriority={'#':0,'+':1,'-':1,'*':2,'/':2,'(':0,')':0}for cpStr in center_computer:tempStack=['#']resStack=[]comptingStr=cpStr.replace(" ","")print(comptingStr)while len(comptingStr)>0:tokenInfo=updateStack(comptingStr,tempStack,resStack,operatorsPriority)comptingStr=comptingStr[tokenInfo[1]:]clearStack(tempStack,resStack)resStack.reverse()  print(resStack)#----逆波兰表达式求解opts=operatorsPriority.keys()runStack=[]while  len(resStack)>0:data=resStack.pop()if data not in opts:runStack.append(data)else:n2=runStack.pop()n1=runStack.pop()result=eval(str(n1)+data+str(n2))runStack.append(result)print(str(n1)+data+str(n2),runStack,resStack)print(f"{cpStr}结果是:{runStack[0]}\n-------------------\n")11+3*7-9/3
['-', '/', 3.0, 9.0, '+', '*', 7.0, 3.0, 11.0]
3.0*7.0 [11.0, 21.0] ['-', '/', 3.0, 9.0, '+']
11.0+21.0 [32.0] ['-', '/', 3.0, 9.0]
9.0/3.0 [32.0, 3.0] ['-']
32.0-3.0 [29.0] []
11+3*7-9/3结果是:29.0
-------------------(1+3)*(1+9)+16/(4*2)
['+', '/', '*', 2.0, 4.0, 16.0, '*', '+', 9.0, 1.0, '+', 3.0, 1.0]
1.0+3.0 [4.0] ['+', '/', '*', 2.0, 4.0, 16.0, '*', '+', 9.0, 1.0]
1.0+9.0 [4.0, 10.0] ['+', '/', '*', 2.0, 4.0, 16.0, '*']
4.0*10.0 [40.0] ['+', '/', '*', 2.0, 4.0, 16.0]
4.0*2.0 [40.0, 16.0, 8.0] ['+', '/']
16.0/8.0 [40.0, 2.0] ['+']
40.0+2.0 [42.0] []
(1+3)*(1+9)+16/(4*2)结果是:42.0
-------------------(11+32.61)/8*66/6
['/', 6.0, '*', 66.0, '/', 8.0, '+', 32.61, 11.0]
11.0+32.61 [43.61] ['/', 6.0, '*', 66.0, '/', 8.0]
43.61/8.0 [5.45125] ['/', 6.0, '*', 66.0]
5.45125*66.0 [359.78249999999997] ['/', 6.0]
359.78249999999997/6.0 [59.96375] []
(11+32.61)/8*66/6结果是:59.96375
-------------------(11+32.61)/(8*66)
['/', '*', 66.0, 8.0, '+', 32.61, 11.0]
11.0+32.61 [43.61] ['/', '*', 66.0, 8.0]
8.0*66.0 [43.61, 528.0] ['/']
43.61/528.0 [0.08259469696969697] []
(11+32.61)/(8*66)结果是:0.08259469696969697
-------------------

计算器网页版

# /usr/bin/env python3
# -*- coding: utf-8 -*-
#2-9-4-2.py
import PySimpleGUIWeb as sg
import evalStrdef computeResult(comStr):return evalStr.getResultFromStr(comStr)def main(): ComputeStrLayout=[[sg.Multiline(key='computeStr',background_color='black',text_color='yellow',font="any 30",size=(60,4))]]numsBtLayout=[[sg.Button(i*3+j,size=(4,2),button_color=('white','green'),key=i*3+j) for j in range(1,4)] for i in range(0,3)]comBtLayout1= [[sg.Button('0',size=(4,2),key=0),sg.Button('.',size=(4,2),key='.')],\[sg.Button('(',size=(4,2),key='('),sg.Button('C',size=(4,2),key='C')],\[sg.Button(')',size=(4,2),key=')'),sg.Button('<=',size=(4,2),key='BackDel')],\]comBtLayout2=[\[sg.Button('+',size=(4,2),key='+'),\sg.Button('-',size=(4,2),key='-'),\sg.Button('×',size=(4,2),key='*'),\sg.Button('÷',size=(4,2),key='/'),\sg.Button('=',size=(4,2),key='=')]\]mainLayout=[[sg.Frame('',ComputeStrLayout)],\[sg.Frame('',numsBtLayout),\sg.Column(comBtLayout1)],\[sg.Frame('',comBtLayout2)],\]window = sg.Window('计算器', mainLayout)while True:event, values = window.read()if event in (sg.WIN_CLOSED, 'Exit'):#最后从屏幕上移除window.close()                 breakif event in list(range(10)) or event in ['.','(',')','+','-','*','/']:window['computeStr'].update(values['computeStr']+str(event))elif event=='C':window['computeStr'].update('')elif event=='=':window['computeStr'].update("%.2f"%computeResult(values['computeStr']))elif event=='BackDel':window['computeStr'].update(values['computeStr'][:-1])if __name__ == "__main__":main()exit()# /usr/bin/env python3
# -*- coding: utf-8 -*-
#2-9-4-3.py
import PySimpleGUIWeb as sg
import evalStrdef computeResult(comStr):return eval(comStr)def main(): ComputeStrLayout=[[sg.Multiline(key='computeStr',background_color='black',text_color='yellow',font="any 30",size=(60,4))]]numsBtLayout=[[sg.Button(i*3+j,size=(4,2),button_color=('white','green'),key=i*3+j) for j in range(1,4)] for i in range(0,3)]comBtLayout1= [[sg.Button('0',size=(4,2),key=0),sg.Button('.',size=(4,2),key='.')],\[sg.Button('(',size=(4,2),key='('),sg.Button('C',size=(4,2),key='C')],\[sg.Button(')',size=(4,2),key=')'),sg.Button('<=',size=(4,2),key='BackDel')],\]comBtLayout2=[\[sg.Button('+',size=(4,2),key='+'),\sg.Button('-',size=(4,2),key='-'),\sg.Button('×',size=(4,2),key='*'),\sg.Button('÷',size=(4,2),key='/'),\sg.Button('=',size=(4,2),key='=')]\]mainLayout=[[sg.Frame('',ComputeStrLayout)],\[sg.Frame('',numsBtLayout),\sg.Column(comBtLayout1)],\[sg.Frame('',comBtLayout2)],\]window = sg.Window('计算器', mainLayout)while True:event, values = window.read()if event in (sg.WIN_CLOSED, 'Exit'):#最后从屏幕上移除window.close()                 breakif event in list(range(10)) or event in ['.','(',')','+','-','*','/']:window['computeStr'].update(values['computeStr']+str(event))elif event=='C':window['computeStr'].update('')elif event=='=':window['computeStr'].update("%.2f"%computeResult(values['computeStr']))elif event=='BackDel':window['computeStr'].update(values['computeStr'][:-1])if __name__ == "__main__":main()exit()

python杂记-逆波兰表达式求解相关推荐

  1. 【数据结构与算法】之深入解析“逆波兰表达式求值”的求解思路与算法示例

    一.题目要求 根据逆波兰表示法,求表达式的值.有效的算符包括 +.-.*./,每个运算对象可以是整数,也可以是另一个逆波兰表达式. 两个整数之间的除法只保留整数部分. 可以保证给定的逆波兰表达式总是有 ...

  2. 征战蓝桥 —— 2013年第四届 —— C/C++A组第6题——逆波兰表达式

    标题:逆波兰表达式 正常的表达式称为中缀表达式,运算符在中间,主要是给人阅读的,机器求解并不方便. 例如:3 + 5 * (2 + 6) - 1 而且,常常需要用括号来改变运算次序. 相反,如果使用逆 ...

  3. 数据结构链表之栈——解决括号匹配问题和逆波兰表达式求值问题——6

    括号匹配问题和逆波兰表达式求值问题 基于上一节已经使用python代码对栈进行了简单的实现,这一节我们在其基础上解决两个常见的问题 案例 括号匹配问题(点我直接到代码实现) 逆波兰表达式求值问题(点我 ...

  4. 信息学奥赛一本通(1198:逆波兰表达式)

    1198:逆波兰表达式 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 9734     通过数: 5698 [题目描述] 逆波兰表达式是一种把运算符前置的算术表达 ...

  5. 逆波兰表达式(信息学奥赛一本通-T1198)

    [题目描述] 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + ...

  6. 7-323 逆波兰表达式 (10 分)

    7-323 逆波兰表达式 (10 分) 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改 ...

  7. Bailian2694 逆波兰表达式(POJ NOI0202-1696, POJ NOI0303-1696)【文本】

    问题链接:POJ NOI0202-1696 逆波兰表达式. 问题链接:POJ NOI0303-1696 逆波兰表达式. 逆波兰表达式 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式 ...

  8. CCF NOI1121 逆波兰表达式

    问题链接:CCF NOI1121 逆波兰表达式. 时间限制: 1000 ms  空间限制: 262144 KB 题目描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰 ...

  9. 算法一:递归(包含Hanoi问题、N皇后问题、逆波兰表达式、爬楼梯、放苹果、全排列)

    递归 递归在算法中具有很重要的地位,也是很多学习编程的初学者非常头疼的问题,看我的这篇文章,希望能为还处于迷雾中的你带来希望 首先我们要知道递归的作用: 1.可替代多重循环 2.解决本来就是用递归形式 ...

最新文章

  1. 链表问题16——单链表的选择排序
  2. 字典树(Trie树)
  3. Vue中富文本编辑器的使用
  4. android hfp分析,Android HFP-转
  5. Leetcode 720. Longest Word in Dictionary
  6. 如何官网下载最新的谷歌chrome浏览器离线安装包
  7. 一个五年Android开发者百度、阿里、聚美、映客的面试心经
  8. 如何安装pandas包
  9. clover更新驱动 后不能开机_Big Sur安装常见问题【持续更新】
  10. word:如何从第三页插入目录
  11. SpringBoot集成微信支付(二维码支付)
  12. matlab 二次不等式约束,请教高手如何用matlab解多元二次不等式的解,有三个未知数x1,x2,x3,约束条件如下:...
  13. net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting head
  14. debug - 用Procmon记录目标程序启动后的操作
  15. 关于程序员的自我提升
  16. 用FPGA做一个生日礼物
  17. vscode代码自动格式化快捷键
  18. Shp2osm:shp转换为osm格式文件
  19. java获取当前年月日历_java万年历,获取该年月日历表
  20. 抽象代数之群同态基本定理的证明之群同态的核是群G的正规子群

热门文章

  1. matlab 二次最优控制,基于MATLAB的线性二次型最优控制
  2. python 2020微光 笔试01 分辨复读机
  3. wdr6500 php,WDR6500成功刷上OpenWrt!!!附上教程。
  4. html fixed垂直居中,前端垂直居中的几种简单实现
  5. Android:URLEncoder空格被转码为“+”号
  6. 查看Linux 、Apache 、 MySQL 、 PHP 版本的方法
  7. 考勤软件之:考勤排班规则
  8. 下载链接后的MD5是什么意思?
  9. 【MYSQL】大量数据入库方案
  10. 十一 使用python的scapy和nmap模块进行主机存活探测