ZH奶酪:Python 中缀表达式转换后缀表达式
实现一个可以处理加减乘数运算的中缀表达式转换后缀表达式的程序:
一个输入中缀表达式inOrder
一个输出池pool
一个缓存栈stack
从前至后逐字读取inOrder
首先看一下不包含括号的:
(1)操作数:直接输出到pool
(2)操作符:判断当前操作符与stack[top]操作符的优先级
<1>当前操作符优先级高于stack[top]:将当前操作符添加到stack中;
<2>当前操作符优先级低于或等于stack[top]:从stack[top]开始出栈,直到stack[top]优先级高于当前操作符,然后将当前操作符入栈;
(3)当inOrder遍历结束,如果stack非空,反转stack,添加到pool尾
__author__ = 'ZhangHe'
def in2post(inOrder):
pool = ''
stack = ''
for i in inOrder:
ret = proc(i,switch(i),stack,pool)
stack = ret['stack']
pool = ret['pool']
if stack != '':
stack = stack[::-1]
return pool+stack def switch(c):
operator1 = '+-'
operator2 = '*/'
num = 'abcdefg'
if c in num:
return 0
if c in operator1:
return 1
if c in operator2:
return 2
def proc(c,op,stack,pool):
top = len(stack)-1 if op == 0:#abcdefg
pool += c
if op == 2 or op==1:#*
if top == -1:
stack += c
elif switch(stack[top]) < op:
stack += c
else:
while top != -1 and switch(stack[top]) >= op:
pool += stack[top]
top -= 1
if top != -1:
stack = stack[0:top+1]
else:
stack = ''
stack += c
ret = {
'stack':stack,
'pool':pool
}
return ret
inOrder = 'a+b*c-d*e+f/g'
48 print in2post(inOrder)
当包含括号的时候应该考虑哪些因素呢?
在上个程序的基础上,进一步考虑下边的几点:
(4)加入括号之后,“(”拥有最高优先级,也就是说,遇到“(”就放到stack中就好了;
(5)遇到“)”的操作也比较简单,直接把stack中的元素逐一弹出到pool,直到弹出“(”;
此时需要新的操作符规则:
(5)操作符:判断当前操作符与stack[top]操作符的优先级
<1>当前操作符优先级高于stack[top]或者stack[top]==‘(’:将当前操作符添加到stack中;
<2>当前操作符优先级低于或等于stack[top]:从stack[top]开始出栈,直到stack[top]优先级高于当前操作符或者stack[top]为“(”,然后将当前操作符入栈;
__author__ = 'ZhangHe'
def in2post(inOrder):
pool = ''
stack = ''
for i in inOrder:
ret = proc(i,switch(i),stack,pool)
stack = ret['stack']
pool = ret['pool']
if stack != '':
stack = stack[::-1]
return pool+stack def switch(c):
operator1 = '+-'
operator2 = '*/'
operator3 = ')'
operator4 = '('
num = 'abcdefg'
if c in num:
return 0
if c in operator1:
return 1
if c in operator2:
return 2
if c in operator3:
return 3
if c in operator4:
return 4
def proc(c,op,stack,pool):
top = len(stack)-1 if op == 0:#abcdefg
pool += c
if op == 2 or op==1:#*
if top == -1:
stack += c
elif switch(stack[top]) < op or stack[top] == '(':
stack += c
else:
while top != -1 and switch(stack[top]) >= op and switch(stack[top])<switch(')'):
pool += stack[top]
top -= 1
if top != -1:
stack = stack[0:top+1]
else:
stack = ''
stack += c
if op == 3:#)
while top!= -1 and stack[top] != '(':
pool += stack[top]
top -= 1
stack = stack[0:top]
if op == 4:#(
stack += c
ret = {
'stack':stack,
'pool':pool
}
return ret
# inOrder = 'a+b*c-d*e+f/g'
inOrder = 'a+b*c+(d*e+f)*g'
print in2post(inOrder)
输出:
abc*+de*f+g*+
ZH奶酪:Python 中缀表达式转换后缀表达式的更多相关文章
- 中缀表达式转后缀表达式(Java代码实现)
后缀表达式求值 后缀表达式又叫逆波兰表达式,其求值过程可以用到栈来辅助存储.例如要求值的后缀表达式为:1 2 3 + 4 * + 5 -,则求值过程如下: 遍历表达式,遇到数字时直接入栈,栈结构如下 ...
- Python与数据结构[1] -> 栈/Stack[1] -> 中缀表达式与后缀表达式的转换和计算
中缀表达式与后缀表达式的转换和计算 目录 中缀表达式转换为后缀表达式 后缀表达式的计算 1 中缀表达式转换为后缀表达式 中缀表达式转换为后缀表达式的实现方式为: 依次获取中缀表达式的元素, 若元素为操 ...
- 中缀表达式得到后缀表达式(c++、python实现)
将中缀表达式转换为后缀表达式的算法思想如下: 从左往右开始扫描中缀表达式 遇到数字加入到后缀表达式 遇到运算符时: 1.若为‘(’,入栈 2.若为’)‘,把栈中的运算符依次加入后缀表达式,直到出现'( ...
- 3-06. 表达式转换(25)(中缀表达式转后缀表达式ZJU_PAT)
题目链接:http://pat.zju.edu.cn/contests/ds/3-06 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式. 日常使用的算术表达式是採用中缀表示法,即二元运算符位于两 ...
- 中缀表达式转后缀表达式(Python实现)
中缀表达式转后缀表达式 中缀表达式转后缀表达式的规则: 1.遇到操作数,直接输出: 2.栈为空时,遇到运算符,入栈: 3.遇到左括号,将其入栈: 4.遇到右括号,执行出栈操作,并将出栈的元素输出,直到 ...
- 利用stack结构,将中缀表达式转换为后缀表达式并求值的算法实现
#!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving with Algorithms and Da ...
- RPN-逆波兰计算器-中缀表达式转后缀表达式-javascript
1.利用栈(Stack)来存储操作数和操作符: 2.包含中缀表达式转后缀表达式的函数,这个是难点,也是关键点: 2.1.将输入字符串转为数组: 2.2.对转换来的字符进行遍历:创建一个数组,用来给存储 ...
- NYOJ--257--郁闷的C小加(一)(中缀表达式变后缀表达式 )
郁闷的C小加(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说 ...
- 栈的简单应用之中缀表达式转后缀表达式(C语言实现逆波兰式)
一.前言 普通人在书写计算式时会选择中缀表达式,这样符合人脑的认知习惯.可计算机处理时后缀表达式才能使处理速度更快,其原因是利用堆栈结构减少计算机内存访问.同时它也是一个很好锻炼栈这个数据结构的应 ...
随机推荐
- linux使用flock文件锁
使用linux flock 文件锁实现任务锁定,解决冲突 格式: flock [-sxun][-w #] fd# flock [-sxon][-w #] file [-c] command flock ...
- 在 Confluence 6 中连 Jira 的问题解决
下面是可能会发生的一些错误信息.如果你的系统中出现了下面的一些提示,你应该调整你的日志错误级别到 WARN,然后查看具体的错误原因.请参考:Configuring Logging. error.jir ...
- 微信公众号开发之如何一键导出微信所有用户信息到Excel
微信开发交流群:148540125 系列文章参考地址 极速开发微信公众号欢迎留言.转发.打赏 项目源码参考地址 点我点我--欢迎Start 极速开发微信公众号系列文章之如何一键导出微信所有用户信息到E ...
- nyoj-310-河南省第四届省赛题目-二分+dinic
SECRET 时间限制:3000 ms | 内存限制:65535 KB 难度:6 描述 Dr.Kong is constructing a new machine and wishes to ...
- Oracle11g温习-第六章:控制文件
2013年4月27日 星期六 10:33 .控制文件的功能和特点 1) [定义数据库当前物理状态] 2) [维护数据的一致性] 如果控制文件中的检查点与数据文件中的一致,则说明数据一致,可以启动到 ...
- Chrome DevTools 的 Sources 调试
在 Chrome 中调试 JS 代码,那你不得不与 Chrome DevTools 的 Sources 面板打交道,所以文章主要通过介绍 Sources 面板上的各部分功能来介绍如何调试网页中的 JS ...
- webservice 基本要点
webservice的特点 webservices是自我包含的 webservices是自我描述的 webservices是跨平台和语言的 webservices是基于开放和标准的 webservic ...
- Get gcc built-in macros using command gcc -dM -E - < /dev/null
root@vmuser-virtual-machine:/home/vmuser# gcc -dM -E - < /dev/null #define __SSP_STRONG__ 3#defin ...
- LA3905
题意: 给出n颗流星,第i颗在第T秒时飞到(xi+ai*t,yi+bi*t),给出一个矩形,问在某一时刻这个矩形中的流星数目最多有多少 题解: 首先计算出每一颗流星经过时间 然后左端点移动,计算出少了 ...
- 第三视角团队:"Jarvis For Chat"团队选题报告
"Jarvis For Chat"团队选题报告 组长博客链接 本次作业链接 NABCD在项目中的使用 N(Need,需求) QQ和微信已经成为人们社交的必需品,在QQ有7.8亿活跃 ...