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 相关文章推荐
以Flask为例讲解Python的框架的使用方法
Apr 29 Python
详解Python函数作用域的LEGB顺序
May 14 Python
Python程序中的观察者模式结构编写示例
May 27 Python
Python 正则表达式实现计算器功能
Apr 29 Python
Python实现简单文本字符串处理的方法
Jan 22 Python
Python使用指定字符长度切分数据示例
Dec 05 Python
浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点
Jun 08 Python
pytorch 限制GPU使用效率详解(计算效率)
Jun 27 Python
解决redis与Python交互取出来的是bytes类型的问题
Jul 16 Python
Python 多进程、多线程效率对比
Nov 19 Python
python 用opencv实现图像修复和图像金字塔
Nov 27 Python
Python 中的Sympy详细使用
Aug 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
PHP分页显示制作详细讲解
2008/11/19 PHP
PHP 面向对象 final类与final方法
2010/05/05 PHP
php根据用户语言跳转相应网页
2015/11/04 PHP
PHP书写格式详解(必看)
2016/05/23 PHP
基于PHP实现短信验证码发送次数限制
2020/07/11 PHP
解读IE和firefox下JScript和HREF的执行顺序
2008/01/12 Javascript
Javascript 命名空间模式
2013/11/01 Javascript
IE10中flexigrid无法显示数据的解决方法
2015/07/26 Javascript
angular.bind使用心得
2015/10/26 Javascript
第二篇Bootstrap起步
2016/06/21 Javascript
JS导出PDF插件的方法(支持中文、图片使用路径)
2016/07/12 Javascript
Angular ui.bootstrap.pagination分页
2017/01/20 Javascript
ES6中module模块化开发实例浅析
2017/04/06 Javascript
详解angular用$sce服务来过滤HTML标签
2017/04/11 Javascript
js登录滑动验证的实现(不滑动无法登陆)
2018/01/03 Javascript
vue cli3 配置proxy代理无效的解决
2019/10/30 Javascript
微信小游戏中three.js离屏画布的示例代码
2020/10/12 Javascript
操作Windows注册表的简单的Python程序制作教程
2015/04/07 Python
基于python中staticmethod和classmethod的区别(详解)
2017/10/24 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
2019/06/14 Python
pandas 空数据处理方法详解
2019/11/02 Python
如何基于pandas读取csv后合并两个股票
2020/09/25 Python
Python通过Schema实现数据验证方式
2020/11/12 Python
通用的Django注册功能模块实现方法
2021/02/05 Python
在HTML5中使用MathML数学公式的简单讲解
2016/02/19 HTML / CSS
英国工具中心:UK Tool Centre
2017/07/10 全球购物
国际奢侈品品牌童装购物网站:Designer Childrenswear
2019/05/08 全球购物
工程部主管岗位职责
2013/11/17 职场文书
工商管理系学生的自我评价分享
2013/11/29 职场文书
设计师个人求职信范文
2014/02/02 职场文书
迎国庆演讲稿
2014/09/15 职场文书
企业授权委托书范本
2014/09/22 职场文书
考研英语辞职信
2015/05/13 职场文书
餐厅服务员管理制度
2015/08/05 职场文书
八年级语文教学反思
2016/03/03 职场文书
js判断两个数组相等的5种方法
2022/05/06 Javascript