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实现随机密码字典生成器示例
Apr 09 Python
Python中的两个内置模块介绍
Apr 05 Python
初学Python函数的笔记整理
Apr 07 Python
Tornado协程在python2.7如何返回值(实现方法)
Jun 22 Python
python difflib模块示例讲解
Sep 13 Python
python机器学习理论与实战(二)决策树
Jan 19 Python
Django文件存储 自己定制存储系统解析
Aug 02 Python
使用python将excel数据导入数据库过程详解
Aug 27 Python
Python values()与itervalues()的用法详解
Nov 27 Python
如何在Python 游戏中模拟引力
Mar 27 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
Nov 25 Python
Python如何快速找到多个字典中的公共键(key)
Apr 29 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
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
2009/06/08 PHP
Fatal error: Call to undefined function curl_init()解决方法
2010/04/09 PHP
php使用explode()函数将字符串拆分成数组的方法
2015/02/17 PHP
js格式化时间小结
2014/11/03 Javascript
基于jQuery实现的图片切换焦点图整理
2014/12/07 Javascript
javascript实现window.print()去除页眉页脚
2014/12/30 Javascript
JavaScript子窗口调用父窗口变量和函数的方法
2015/10/09 Javascript
Javascript函数式编程语言
2015/10/11 Javascript
Bootstrap面板使用方法
2017/01/16 Javascript
Bootstrap页面标题Page Header的实现方法
2017/03/22 Javascript
对于input 框限定输入值为浮点型的js代码
2017/09/25 Javascript
微信禁止下拉查看URL的处理方法
2017/09/28 Javascript
微信小程序 上传头像的实例详解
2017/10/27 Javascript
vue项目中jsonp跨域获取qq音乐首页推荐问题
2018/05/30 Javascript
vue Element左侧无限级菜单实现
2020/06/10 Javascript
[03:03]2014DOTA2西雅图国际邀请赛 Alliance战队巡礼
2014/07/07 DOTA
Python排序搜索基本算法之插入排序实例分析
2017/12/11 Python
Python WEB应用部署的实现方法
2019/01/02 Python
使用python Telnet远程登录执行程序的方法
2019/01/26 Python
python+OpenCV实现车牌号码识别
2019/11/08 Python
Python argparse模块使用方法解析
2020/02/20 Python
django xadmin中form_layout添加字段显示方式
2020/03/30 Python
Python RabbitMQ实现简单的进程间通信示例
2020/07/02 Python
python右对齐的实例方法
2020/07/05 Python
keras 模型参数,模型保存,中间结果输出操作
2020/07/06 Python
CSS3 真的会替代 SCSS 吗
2021/03/09 HTML / CSS
洲际酒店集团美国官网:IHG美国
2017/11/16 全球购物
法国票务网站:Ticketmaster法国
2018/07/09 全球购物
《蒙娜丽莎之约》教学反思
2014/02/27 职场文书
《木笛》教学反思
2014/03/01 职场文书
商务经理岗位职责
2014/07/30 职场文书
2014年重阳节活动策划方案书
2014/09/16 职场文书
开国大典观后感
2015/06/04 职场文书
忠犬八公的故事观后感
2015/06/05 职场文书
幼儿园安全管理制度
2015/08/05 职场文书
读完《骆驼祥子》的观后感!
2019/07/05 职场文书