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实现Const详解
Jan 27 Python
Python生成随机密码
Mar 10 Python
Python中的Classes和Metaclasses详解
Apr 02 Python
详解Python编程中包的概念与管理
Oct 16 Python
使用python 和 lint 删除项目无用资源的方法
Dec 20 Python
对TensorFlow的assign赋值用法详解
Jul 30 Python
python的pytest框架之命令行参数详解(下)
Jun 27 Python
Django认证系统实现的web页面实现代码
Aug 12 Python
Tensorflow Summary用法学习笔记
Jan 10 Python
关于Python 中的时间处理包datetime和arrow的方法详解
Mar 19 Python
Python3 requests模块如何模仿浏览器及代理
Jun 15 Python
彻底搞懂python 迭代器和生成器
Sep 07 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
Zerg剧情介绍
2020/03/14 星际争霸
php xfocus防注入资料
2008/04/27 PHP
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
2010/05/06 PHP
php导入大量数据到mysql性能优化技巧
2014/12/29 PHP
php短址转换实现方法
2015/02/25 PHP
PHP实现单例模式建立数据库连接的方法分析
2020/02/11 PHP
第一个JavaScript入门基础 document.write输出
2010/02/22 Javascript
JQuery为textarea添加maxlength属性的代码
2010/04/07 Javascript
jQuery.extend 函数详解
2012/02/03 Javascript
javascript中RegExp保留小数点后几位数的方法分享
2013/08/13 Javascript
jquery实现类似EasyUI的页面布局可改变左右的宽度
2020/09/12 Javascript
JS实现仿京东淘宝竖排二级导航
2014/12/08 Javascript
jQuery中常用的遍历函数用法实例总结
2015/09/01 Javascript
jQuery插件实现多级联动菜单效果
2015/12/01 Javascript
JS实现日期时间动态显示的方法
2015/12/07 Javascript
JavaScript对Json的增删改属性详解
2016/06/02 Javascript
js实现随机抽选效果、随机抽选红色球效果
2017/01/13 Javascript
React进阶学习之组件的解耦之道
2017/08/07 Javascript
Vue异步组件处理路由组件加载状态的解决方案
2018/09/07 Javascript
vuejs router history 配置到iis的方法
2018/09/20 Javascript
15个顶级开源JavaScript框架和库
2018/10/10 Javascript
Angular8 简单表单验证的实现示例
2020/06/03 Javascript
Vue实现手机计算器
2020/08/17 Javascript
Python学习笔记之os模块使用总结
2014/11/03 Python
Python实现简单http服务器
2018/04/12 Python
对Python函数设计规范详解
2019/07/19 Python
python lambda函数及三个常用的高阶函数
2020/02/05 Python
html5新增的属性和废除的属性简要概述
2013/02/20 HTML / CSS
俄罗斯在线水暖商店:Perfecto.ru
2019/10/25 全球购物
在weblogic中发布ejb需涉及到哪些配置文件
2012/01/17 面试题
写给学生的新学期寄语
2014/01/18 职场文书
小学运动会表扬稿
2014/01/19 职场文书
手工社团活动方案
2014/02/17 职场文书
领导干部失职检讨书
2015/05/05 职场文书
三下乡活动心得体会
2016/01/23 职场文书
Python实现批量自动整理文件
2022/03/16 Python