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语言实现逆波兰式)
一.前言 普通人在书写计算式时会选择中缀表达式,这样符合人脑的认知习惯.可计算机处理时后缀表达式才能使处理速度更快,其原因是利用堆栈结构减少计算机内存访问.同时它也是一个很好锻炼栈这个数据结构的应 ...
随机推荐
- Andorid 之日历控件,可左右滑动,包含公历,农历,节假日等
公司项目需要日历这个功能,经过查阅资料写了个demo,包含公历,农历,节假日等,还可左右滑动. 效果图: 代码: public class MainActivity extends AppCompat ...
- 使用Div + CSS布局页面
在设计网页时,能够控制好各个模块在页面中的位置是非常关键的.本章将讲解利用Div+CSS对页面元素进行定位的方法. Div是HTML中指定的专门用于布局设计的容器对象 Div是CSS布局的核心对象. ...
- quartz---的一个简单例子
quartz---的一个简单例子 首先建立一个maven项目.jar工程即可.(提示:我前面有如何建立一个maven工程的总结以及maven环境的配置.) 1.建立好后点击到app中运行,--> ...
- c语言枚举类型变量的作用
#include<stdio.h> enum DAY { MON=, TUE, WED, THU, FRI, SAT, SUN }; int main() { enum DAY day; ...
- Spring Cloud Edgware之后版本 Zipkin+Kafka整合
zipkin服务器端 1.依赖 <!-- zipkin server --> <dependency> <groupId>io.zipkin.java</gr ...
- dubbo监控中心搭建
从网上下载了一个dubbo监控中心,地址忘了,文件名是dubbo-monitor-simple-2.5.3-assembly.tar.gz. 修改监控中心配置文件如下: dubbo.container ...
- splunk 通过rest http导入数据
使用 HTTP Event Collector go to Settings > Data inputs > HTTP Event Collector. Then click the Gl ...
- 4.18n阶勒让德多项式求解
Q:编写程序,输入正整数n和任意数x,求出勒让德多项式的值Pn(x) #include <iostream> #include<cstdio> using namespace ...
- 51nod1269Devu and Flowers
题解: 如果没有限制每一种花有多少,那么就是简单的排列组合问题. 那么我们强制让一些花一定都要选. 暴力搜索,然后组合数(逆元) 采用容斥原理来计算最后的答案 代码: #include<bits ...
- onedriver -1T容量,edu邮箱申请。
https://www.cccs.edu/ Apply申请 以前申请过这个红石社区大学. 创建帐号 自己翻译一下填填吧. 注册完,进入My Account,下面会有 2,点进去,也是注册. 3,点进去 ...