python-中缀转换后缀并计算
这个好像比较简单。
前缀规则好像还没有理清楚。
# coding = utf-8
class Stack:
def __init__(self):
self.items = []
# 是否为空
def is_empty(self):
return self.items == []
# 进栈
def push(self, item):
self.items.append(item)
# 出栈
def pop(self):
return self.items.pop()
# 返回栈顶值,不改变栈
def peek(self):
return self.items[len(self.items) - 1]
# 返回栈长度
def size(self):
return len(self.items)
def infix_to_postfix(infix_expr):
prec = dict()
prec["*"] = 3
prec["/"] = 3
prec["+"] = 2
prec["-"] = 2
prec["("] = 1
prec[")"] = 1
postfix_expr = []
s = Stack()
for item in infix_expr.split():
# 如果标记是操作数,将其附加到输出列表的末尾
if item not in prec.keys():
postfix_expr.append(item)
# 如果标记是左括号,将其压到 s 上
elif item == '(':
s.push(item)
# 如果标记是右括号,则弹出 s,直到删除相应的左括号。将每个运算符附加到
# 输出列表的末尾
elif item == ')':
while s.peek() != '(':
postfix_expr.append(s.pop())
s.pop()
# 如果标记是运算符, *,/,+ 或 - ,将其压入 s。但是,首先删除已经在
# s 中具有更高或相等优先级的任何运算符,并将它们加到输出列表中
else:
while (not s.is_empty()) \
and (prec[s.peek()] >= prec[item]):
postfix_expr.append(s.pop())
s.push(item)
print(s.items)
# 当输入表达式被完全处理时,检查 s。仍然在栈上的任何运算符都可以删除并加到
# 输出列表的末尾
while not s.is_empty():
postfix_expr.append(s.pop())
return ' '.join(postfix_expr)
def postfix_eval(postfix_expr):
s = Stack()
for item in postfix_expr.split():
# 如果不是运算符号,压栈
if item not in '+-*/':
s.push(item)
else:
# 如果是运算符号,取出栈上最近两个数字进行运算
# 然后,再将结果压回栈
op2 = int(s.pop())
op1 = int(s.pop())
print(op1, item, op2)
result = do_match(item, op1, op2)
s.push(result)
print(s.items)
return result
# 运行结果
def do_match(op, op1, op2):
if op == '+':
return op1 + op2
elif op == '-':
return op1 - op2
elif op == '*':
return op1 * op2
elif op == '/':
return op1 / op2
else:
raise Exception('Error operation!')
infix_str = '( 23 + 2 ) * 5 - 280 / ( 4 + 11 * 6 - 35 )'
postfix_output = infix_to_postfix(infix_str)
print(infix_str)
print(postfix_output)
postfix_result = postfix_eval(postfix_output)
print(postfix_result)
输出:显示了栈的情况
C:\Users\Sahara\.virtualenvs\untitled\Scripts\python.exe D:/test/python_stack.py
['(']
['(']
['(', '+']
['(', '+']
[]
['*']
['*']
['-']
['-']
['-', '/']
['-', '/', '(']
['-', '/', '(']
['-', '/', '(', '+']
['-', '/', '(', '+']
['-', '/', '(', '+', '*']
['-', '/', '(', '+', '*']
['-', '/', '(', '-']
['-', '/', '(', '-']
['-', '/']
( 23 + 2 ) * 5 - 280 / ( 4 + 11 * 6 - 35 )
23 2 + 5 * 280 4 11 6 * + 35 - / -
['23']
['23', '2']
23 + 2
[25]
[25, '5']
25 * 5
[125]
[125, '280']
[125, '280', '4']
[125, '280', '4', '11']
[125, '280', '4', '11', '6']
11 * 6
[125, '280', '4', 66]
4 + 66
[125, '280', 70]
[125, '280', 70, '35']
70 - 35
[125, '280', 35]
280 / 35
[125, 8.0]
125 - 8
[117]
117
python-中缀转换后缀并计算的更多相关文章
- 《java数据结构与算法》笔记-CH4-8栈结构实现后缀表达式计算结果
/** * 中缀表达式转换成后缀表达式: 从输入(中缀表达式)中读取的字符,规则: 操作数: 写至输出 左括号: 推其入栈 右括号: 栈非空时重复以下步骤--> * 若项不为(,则写至输出: 若 ...
- ZH奶酪:Python 中缀表达式转换后缀表达式
实现一个可以处理加减乘数运算的中缀表达式转换后缀表达式的程序: 一个输入中缀表达式inOrder 一个输出池pool 一个缓存栈stack 从前至后逐字读取inOrder 首先看一下不包含括号的: ( ...
- 栈应用之 后缀表达式计算 (python 版)
栈应用之 后缀表达式计算 (python 版) 后缀表达式特别适合计算机处理 1. 中缀表达式.前缀表达式.后缀表达式区别 中缀表达式:(3 - 5) * (6 + 17 * 4) / 3 17 ...
- PTA-7-20 表达式转换(中缀转后缀,带括号,负数,小数转换)
本题考点:中缀表达式转后缀表达式. 难点: 带有小数的数字 数字可能带有正负号 题目描述: 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.日常使用的算术表达式是采用中缀表示法,即二元运算符位于 ...
- 栈的应用1——超级计算器(中缀与后缀表达式)C语言
这里要学的程序主要用来实现一个功能——输入表达式输出结果,也就是一个计算器.效果如下: 这个程序主要有两个步骤:1.把中缀表达式转换为后缀表达式:2.计算后缀表达式的结果. 首先先明白几个问题: 1. ...
- Java数据结构和算法(六)——前缀、中缀、后缀表达式
前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...
- C++ 中缀转后缀表达式并求值
//中缀转后缀 #include<iostream> #include<stack> using namespace std; int prio(char x){ ; ; ; ...
- Java数据结构和算法(六):前缀、中缀、后缀表达式
前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...
- 【C++】朝花夕拾——中缀转后缀
对于简单的四则运算而言,后缀表达式可以通过使用栈(stack)快速算出结果 ==================================我是分割线======================= ...
随机推荐
- 待解决输入istream_iterator
山寨版 istream_iterator 输入 第一行是整数t,表示有t组数据,每组数据一行,三个整数加两个字符串.字符串是不含空格的. 输出 对每组数据,输出二行,在第一行输出第一个数,第二行原样输 ...
- Python3学习笔记04-运算符
算术运算符 + 加两个对象相加 - 减得到负数或是一个数减去另一个数 * 乘两个数相乘或是返回一个被重复若干次的字符串 / 除x 除以 y % 取模返回除法的余 ...
- 【原创】Linux基础之windows linux双系统
1 下载iso opensuse 下载: http://download.opensuse.org/distribution/openSUSE-stable/iso/openSUSE-Leap-15. ...
- EventBus 3.0使用详解
01 前言 当我们进行项目开发的时候,往往是需要应用程序的各组件.组件与后台线程间进行通信,比如在子线程中进行请求数据,当数据请求完毕后通过Handler或者是广播通知UI,而两个Fragment之家 ...
- linux与window互传文件
首先我们的目标是把一个很大的文件传到linux中,所以我们先要让linux节点开启ftp服务 FTP 10.1.61.212 如果对方没有开启FTP服务,那么这个命令就不会有效果. 1.开启xftp ...
- 分享几个Android很强势的的开源框架
前言 今天介绍一下android开发者中比较热门的开源代码,这些代码绝大多数可以直接应用到项目中.更多可参考很值得收藏的安卓开源控件库 一个强大的图片选择器,支持多选,和选聘选择 项目地址: http ...
- IOS 将状态栏改为白色
1.将 View controller-based status bar appearance 删除(默认为 YES),或设置为YES 2.设置rootViewcontroller,如果为viewC ...
- Confluence 6 启用 HTTP 压缩
在屏幕的右上角单击 控制台按钮 ,然后选择 基本配置(General Configuration) 链接. 在左侧的面板中选择 通用配置(General Configuration). 启用 HTTP ...
- Confluence 6 创建-使用-删除快捷链接
创建快捷链接 如何创建一个快捷键链接: 在屏幕的右上角单击 控制台按钮 ,然后选择 General Configuration 链接. 在左侧面板中选择 快捷链接(Shortcut Links). 为 ...
- Confluence 6 配置服务器基础地址示例
如果 Confluence 的安装是没有安装在非根目录路径(这个是上下文路径),然后服务器基础 URL 地址应该包括上下文地址.例如,你的 Confluence 正在运行在下面的地址: http:// ...