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支持断点续传的多线程下载示例
Jan 16 Python
详尽讲述用Python的Django框架测试驱动开发的教程
Apr 22 Python
python编码总结(编码类型、格式、转码)
Jul 01 Python
python中lambda()的用法
Nov 16 Python
Python基于PyGraphics包实现图片截取功能的方法
Dec 21 Python
python使用tensorflow深度学习识别验证码
Apr 03 Python
python实现嵌套列表平铺的两种方法
Nov 08 Python
Python 判断图像是否读取成功的方法
Jan 26 Python
Django 拆分model和view的实现方法
Aug 16 Python
Python实现多线程/多进程的TCP服务器
Sep 03 Python
Python通过TensorFLow进行线性模型训练原理与实现方法详解
Jan 15 Python
python实现canny边缘检测
Sep 14 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 MySQL应用中使用XOR运算加密算法分享
2011/08/28 PHP
解析file_get_contents模仿浏览器头(user_agent)获取数据
2013/06/27 PHP
PHP+Ajax验证码验证用户登录
2016/07/20 PHP
php原生导出excel文件的两种方法(推荐)
2016/11/19 PHP
laravel项目利用twemproxy部署redis集群的完整步骤
2018/05/11 PHP
php基于协程实现异步的方法分析
2019/07/17 PHP
理解Javascript_11_constructor实现原理
2010/10/18 Javascript
原始的js代码和jquery对比体会
2013/09/10 Javascript
JS复制内容到剪切板的实例代码(兼容IE与火狐)
2013/11/19 Javascript
JQuery实现级联下拉框效果实例讲解
2015/09/17 Javascript
JavaScript获取css行间样式,内连样式和外链样式的简单方法
2016/07/18 Javascript
Node.js使用Express.Router的方法
2017/11/14 Javascript
手机注册发送验证码倒计时的简单实例
2017/11/15 Javascript
vue2 mint-ui loadmore实现下拉刷新,上拉更多功能
2018/03/21 Javascript
JavaScript使用表单元素验证表单的示例代码
2019/08/20 Javascript
layui动态渲染生成左侧3级菜单的方法(根据后台返回数据)
2019/09/23 Javascript
Vue可自定义tab组件用法实例
2019/10/24 Javascript
Python 执行字符串表达式函数(eval exec execfile)
2014/08/11 Python
python实现简单ftp客户端的方法
2015/06/28 Python
解决python3在anaconda下安装caffe失败的问题
2017/06/15 Python
Python内建函数之raw_input()与input()代码解析
2017/10/26 Python
基于Python实现的ID3决策树功能示例
2018/01/02 Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
2018/12/11 Python
详解Python 函数如何重载?
2019/04/23 Python
python做接口测试的必要性
2019/11/20 Python
python图形开发GUI库pyqt5的基本使用方法详解
2020/02/14 Python
Python Tornado之跨域请求与Options请求方式
2020/03/28 Python
Python爬虫教程知识点总结
2020/10/19 Python
matplotlib grid()设置网格线外观的实现
2021/02/22 Python
微软俄罗斯官方网站:Microsoft俄罗斯
2016/09/18 全球购物
商场经理竞聘演讲稿
2014/01/01 职场文书
五一服装活动方案
2014/01/11 职场文书
宣传策划类求职信范文
2014/01/31 职场文书
运动会开幕式解说词
2014/02/05 职场文书
2014年售后服务工作总结
2014/11/18 职场文书
合理化建议书
2015/02/04 职场文书