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程序员
Jun 12 Python
Python 高级专用类方法的实例详解
Sep 11 Python
Python编程中NotImplementedError的使用方法
Apr 21 Python
TensorFlow的权值更新方法
Jun 14 Python
python K近邻算法的kd树实现
Sep 06 Python
Python中修改字符串的四种方法
Nov 02 Python
python 实现读取一个excel多个sheet表并合并的方法
Feb 12 Python
python、PyTorch图像读取与numpy转换实例
Jan 13 Python
基于python实现数组格式参数加密计算
Apr 21 Python
python读取excel进行遍历/xlrd模块操作
Jul 12 Python
Python paramiko使用方法代码汇总
Nov 20 Python
Django多个app urls配置代码实例
Nov 26 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
生成缩略图
2006/10/09 PHP
PHPMailer邮件类利用smtp.163.com发送邮件方法
2008/09/11 PHP
PHP与MYSQL中UTF8 中文排序示例代码
2014/10/23 PHP
关于URL最大长度限制的相关资料查证
2014/12/23 PHP
php生成二维码不保存服务器还有下载功能的实现代码
2018/08/09 PHP
PHP递归的三种常用方式
2019/02/28 PHP
PHP设计模式之迭代器模式Iterator实例分析【对象行为型】
2020/04/26 PHP
jquery获取input的value问题说明
2010/08/19 Javascript
js判断浏览器类型的方法
2013/08/07 Javascript
jQuery的$.proxy()应用示例介绍
2014/04/03 Javascript
使用upstart把nodejs应用封装为系统服务实例
2014/06/01 NodeJs
jQuery中index()方法用法实例
2014/12/27 Javascript
jQuery中offset()方法用法实例
2015/01/16 Javascript
简单实现限制uploadify上传个数
2015/11/16 Javascript
jQuery中的select操作详解
2016/11/29 Javascript
JS使用正则截取两个字符串之间的字符串实现方法详解
2017/01/06 Javascript
Angular+Bootstrap+Spring Boot实现分页功能实例代码
2017/07/21 Javascript
jquery 通过ajax请求获取后台数据显示在表格上的方法
2018/08/08 jQuery
JavaScript使用indexOf()实现数组去重的方法分析
2018/09/04 Javascript
深入理解NodeJS 多进程和集群
2018/10/17 NodeJs
vue 实现element-ui中的加载中状态
2020/11/11 Javascript
Python使用pickle模块存储数据报错解决示例代码
2018/01/26 Python
python高阶爬虫实战分析
2018/07/29 Python
详解python中递归函数
2019/04/16 Python
python对矩阵进行转置的2种处理方法
2019/07/17 Python
django基于cors解决跨域请求问题详解
2019/08/06 Python
Python虚拟环境virtualenv创建及使用过程图解
2020/12/08 Python
西班牙手机之家:Phone House
2018/10/18 全球购物
马来西亚在线药房:RoyalePharma
2019/12/01 全球购物
学生思想表现的评语
2014/01/30 职场文书
学校元旦晚会方案
2014/02/19 职场文书
2014年中班下学期工作总结
2014/12/11 职场文书
南阳市白酒市场的调查报告
2019/11/08 职场文书
总结几个非常实用的Python库
2021/06/26 Python
基于Python实现对比Exce的工具
2022/04/07 Python
bose降噪耳机音能消除人声吗
2022/04/19 数码科技