python利用后缀表达式实现计算器功能


Posted in Python onFebruary 22, 2021

本文实例为大家分享了python实现计算器功能的具体代码,供大家参考,具体内容如下

前缀表达式

运算符在数字的前面

1 + (2 + 3) * 4 - 5 (中缀)
- + 1 * + 2 3 4 5  (前缀)

前缀表达式的计算方法和后缀表达式类似,只是变成了从右往左扫描

中缀表达式

运算符在中间,运算时需要考虑运算符优先级

1+2*3-5
要先算2*3....

后缀表达式

运算符在数字的后面,运算时不考虑优先级,只需要遇到符号,就把他前面的两个数字进行运算就好了

例如: a b c + + 即: a + (b + c)

1 + (2 + 3) * 4 - 5 (中缀)
1 2 3 + 4 * + 5 -  (后缀)

因为无需考虑优先级,运算是线性结构的,其用栈实现会很简单

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

运算规律,运算数位置不变,改变的是符号的位置

2 + 9 / 3 - 5   (中缀)
2 9 3 / + 5 -  (后缀)

具体方式

1.从左到右进行遍历
2.运算数,直接输出.
3.左括号,直接压入堆栈,(括号是最高优先级,无需比较)(入栈后优先级降到最低,确保其他符号正常入栈)
4.右括号,(意味着括号已结束)不断弹出栈顶运算符并输出直到遇到左括号(弹出但不输出)
5.运算符,将该运算符与栈顶运算符进行比较,
如果优先级高于栈顶运算符则压入堆栈(该部分运算还不能进行),
如果优先级低于等于栈顶运算符则将栈顶运算符弹出并输出,然后比较新的栈顶运算符.
(低于弹出意味着前面部分可以运算,先输出的一定是高优先级运算符,等于弹出是因为同等优先级,从左到右运算)
直到优先级大于栈顶运算符或者栈空,再将该运算符入栈.
**6.*如果对象*处理完毕,则按顺序弹出并输出栈中所有运算符.

python利用后缀表达式实现计算器功能

后缀表达式运算步骤

后缀表达式运算步骤:

(以堆栈储存)
从左到右,遇到运算符就弹出相应的运算数,运算后再把结果入栈.最终结果就是栈顶数的值.
(由于该运算为线性结构,具体运算时是不需要储存输出后的运算符,一般是输出一个运算符就进行一次运算,不像图中要储存输出状态.)

注意点:

有时候'-'(负号)是单目运算符,则要修改运算数.
遇到其他运算符(如幂运算)也类似.

python代码例子

'''
中缀转换为后缀
'''

a = "1+(2+6/1+2)"
#a = "2+9/3-5"
# 可能出现的符号 
symbol_1 = ['+','-','*','/']
symbol_2 = ['(']
symbol_3 = [')']
# 符号的优先级
priority = {'#':-1,'(':1,'+':2,'-':2,'*':3,'/':3}
match_2 = {')':'('}
# 存储符号的栈
zhan = []
zhan.append("#")
# 结果
result = []

'''
### 这里只是对表达式进行转换
for i in a:
 # 如果是数字直接添加到结果
 if i.isdigit():
 result.append(i)
 # 如果是 + - * / 运算,则先出栈更低优先级的,然后入栈
 elif i in symbol_1:
 # 如果优先级低,则出栈所有优先级>=的符号
 while priority[i] <= priority[zhan[-1]]:
 result.append(zhan.pop())
 # 压入符号
 zhan.append(i)
 # 如果是左括号,直接压入
 elif i in symbol_2:
 zhan.append(i)
 # 如果是右括号,则出栈,直到遇到了匹配的左括号,然后吧左括号也出栈
 elif i in symbol_3:
 while zhan[-1] != match_2[i]:
 result.append(zhan.pop())
 zhan.pop()
 
result.append(zhan.pop())
print(''.join(result))

'''
# 下面通过将中缀表达式转换为后缀表达式,并进行运算
def my_operation(symbol, a, b):
 a,b = int(a),int(b)
 if symbol == '+':
 return a + b
 elif symbol == '-':
 return a - b
 elif symbol == '*':
 return a * b
 elif symbol == '/':
 return a / b

def to_operation(result, zhan):
 two = result.pop()
 one = result.pop()
 symbol = zhan.pop()
 ret = my_operation(symbol, one, two)
 print(f"{one}{symbol}{two} = {ret}")
 result.append(ret)

### 在表达式转换的时候就一边进行了运算
for i in a:
 # 如果是数字直接添加到结果
 if i.isdigit():
 result.append(i)
 # 如果是 + - * / 运算,则先出栈更低优先级的,然后入栈
 elif i in symbol_1:
 # 如果优先级低,则出栈所有优先级>=的符号
 while priority[i] <= priority[zhan[-1]]:
 to_operation(result, zhan)
 # 压入符号
 zhan.append(i)
 # 如果是左括号,直接压入
 elif i in symbol_2:
 zhan.append(i)
 # 如果是右括号,则出栈,直到遇到了匹配的左括号,然后吧左括号也出栈
 elif i in symbol_3:
 while zhan[-1] != match_2[i]:
 to_operation(result, zhan)
 zhan.pop()
 
to_operation(result, zhan)
print(result)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中声明只包含一个元素的元组数据方法
Aug 25 Python
python字符串,数值计算
Oct 05 Python
python中reload(module)的用法示例详解
Sep 15 Python
Python中property属性实例解析
Feb 10 Python
python+opencv 读取文件夹下的所有图像并批量保存ROI的方法
Jan 10 Python
Python程序打包工具py2exe和PyInstaller详解
Jun 28 Python
python SVD压缩图像的实现代码
Nov 05 Python
pytorch实现onehot编码转为普通label标签
Jan 02 Python
python-sys.stdout作为默认函数参数的实现
Feb 21 Python
Python GUI编程学习笔记之tkinter中messagebox、filedialog控件用法详解
Mar 30 Python
python PyAUtoGUI库实现自动化控制鼠标键盘
Sep 09 Python
使用Python获取爱奇艺电视剧弹幕数据的示例代码
Jan 12 Python
Python使用tkinter实现小时钟效果
Feb 22 #Python
Python tkinter实现日期选择器
Feb 22 #Python
Pyside2中嵌入Matplotlib的绘图的实现
Feb 22 #Python
Python实现Excel自动分组合并单元格
Feb 22 #Python
matplotlib绘制正余弦曲线图的实现
Feb 22 #Python
Python使用tkinter制作在线翻译软件
Feb 22 #Python
Python中使用Selenium环境安装的方法步骤
Feb 22 #Python
You might like
php中静态类与静态变量用法的区别分析
2015/01/15 PHP
PHP的全局错误处理详解
2016/04/25 PHP
php中的explode()函数实例介绍
2019/01/18 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
jQuery获取样式中的背景颜色属性值/颜色值
2012/12/17 Javascript
js拖动div 当鼠标移动时整个div也相应的移动
2013/11/21 Javascript
Jquery实现侧边栏跟随滚动条固定(兼容IE6)
2014/04/02 Javascript
JS实现超简单的鼠标拖动效果
2015/11/02 Javascript
jQuery Mobile开发中日期插件Mobiscroll使用说明
2016/03/02 Javascript
10分钟掌握XML、JSON及其解析
2020/12/06 Javascript
javascript另类方法实现htmlencode()与htmldecode()函数实例分析
2016/11/17 Javascript
node.js实现回调的方法示例
2017/03/01 Javascript
Windows下快速搭建NodeJS本地服务器的步骤
2017/08/09 NodeJs
微信小程序实现跳转的几种方式总结(推荐)
2019/04/24 Javascript
vue拖拽组件 vuedraggable API options实现盒子之间相互拖拽排序
2019/07/08 Javascript
在LayUI图片上传中,解决由跨域问题引起的请求接口错误的方法
2019/09/24 Javascript
微信小程序入门之指南针
2020/10/22 Javascript
Python中pygame的mouse鼠标事件用法实例
2015/11/11 Python
详解python进行mp3格式判断
2016/12/23 Python
Python探索之静态方法和类方法的区别详解
2017/10/27 Python
python解决字符串倒序输出的问题
2018/06/25 Python
Python3.5内置模块之os模块、sys模块、shutil模块用法实例分析
2019/04/27 Python
python操作excel让工作自动化
2019/08/09 Python
tensorflow tf.train.batch之数据批量读取方式
2020/01/20 Python
美国工业用品采购网站:Zoro.com
2020/10/27 全球购物
领导视察欢迎词
2014/01/15 职场文书
幼儿园运动会入场词
2014/02/10 职场文书
酒店开业庆典主持词
2014/03/21 职场文书
企业法人授权委托书
2014/09/25 职场文书
共产党员批评与自我批评
2014/10/15 职场文书
社区植树节活动总结
2015/02/06 职场文书
银行招聘自荐信
2015/03/06 职场文书
拉贝日记观后感
2015/06/05 职场文书
小学英语教师2015年度个人工作总结
2015/10/14 职场文书
2016保送生自荐信范文
2016/01/29 职场文书
《岳阳楼记》原文、译文赏析
2019/09/10 职场文书