实现一个可以处理加减乘数运算的中缀表达式转换后缀表达式的程序:

一个输入中缀表达式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 中缀表达式转换后缀表达式的更多相关文章

  1. 中缀表达式转后缀表达式(Java代码实现)

    后缀表达式求值 后缀表达式又叫逆波兰表达式,其求值过程可以用到栈来辅助存储.例如要求值的后缀表达式为:1 2 3 + 4 * + 5 -,则求值过程如下: 遍历表达式,遇到数字时直接入栈,栈结构如下 ...

  2. Python与数据结构[1] -> 栈/Stack[1] -> 中缀表达式与后缀表达式的转换和计算

    中缀表达式与后缀表达式的转换和计算 目录 中缀表达式转换为后缀表达式 后缀表达式的计算 1 中缀表达式转换为后缀表达式 中缀表达式转换为后缀表达式的实现方式为: 依次获取中缀表达式的元素, 若元素为操 ...

  3. 中缀表达式得到后缀表达式(c++、python实现)

    将中缀表达式转换为后缀表达式的算法思想如下: 从左往右开始扫描中缀表达式 遇到数字加入到后缀表达式 遇到运算符时: 1.若为‘(’,入栈 2.若为’)‘,把栈中的运算符依次加入后缀表达式,直到出现'( ...

  4. 3-06. 表达式转换(25)(中缀表达式转后缀表达式ZJU_PAT)

    题目链接:http://pat.zju.edu.cn/contests/ds/3-06 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式. 日常使用的算术表达式是採用中缀表示法,即二元运算符位于两 ...

  5. 中缀表达式转后缀表达式(Python实现)

    中缀表达式转后缀表达式 中缀表达式转后缀表达式的规则: 1.遇到操作数,直接输出: 2.栈为空时,遇到运算符,入栈: 3.遇到左括号,将其入栈: 4.遇到右括号,执行出栈操作,并将出栈的元素输出,直到 ...

  6. 利用stack结构,将中缀表达式转换为后缀表达式并求值的算法实现

    #!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving with Algorithms and Da ...

  7. RPN-逆波兰计算器-中缀表达式转后缀表达式-javascript

    1.利用栈(Stack)来存储操作数和操作符: 2.包含中缀表达式转后缀表达式的函数,这个是难点,也是关键点: 2.1.将输入字符串转为数组: 2.2.对转换来的字符进行遍历:创建一个数组,用来给存储 ...

  8. NYOJ--257--郁闷的C小加(一)(中缀表达式变后缀表达式 )

    郁闷的C小加(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说 ...

  9. 栈的简单应用之中缀表达式转后缀表达式(C语言实现逆波兰式)

    一.前言   普通人在书写计算式时会选择中缀表达式,这样符合人脑的认知习惯.可计算机处理时后缀表达式才能使处理速度更快,其原因是利用堆栈结构减少计算机内存访问.同时它也是一个很好锻炼栈这个数据结构的应 ...

随机推荐

  1. codeforces 555c// Case of Chocolate// Codeforces Round #310(Div. 1)

    题意:直角边为n的网格巧克力,一格为一块,选择斜边上一点,从左或上吃,直到吃到空气,称为一次操作.给出几个操作,问各能吃几块.如果x是当前要吃的横坐标,在已经吃过的中找x1>=x的第一个x1,即 ...

  2. POJ-1180 Batch Scheduling (分组求最优值+斜率优化)

    题目大意:有n个任务,已知做每件任务所需的时间,并且每件任务都对应一个系数fi.现在,要将这n个任务分成若干个连续的组,每分成一个组的代价是完成这组任务所需的总时间加上一个常数S后再乘以这个区间的系数 ...

  3. UVA-1220 Party at Hali-Bula (树的最大独立集)

    题目大意:数的最大独立集问题.特殊在要求回答答案是否唯一. 题目分析:定义状态dp(i,1),dp(i,0)分别表示以i为根节点的子树选不选i最多可选的人数,f(i,1),f(i,0)分别表示以i为根 ...

  4. 72. Edit Distance *HARD*

    Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2 ...

  5. Linux磁盘管理,vi编辑器以及包管理器

    一.Linux磁盘管理 Linux磁盘管理常用的三个命令为df,du,fdisk df:列出文件系统的整体磁盘使用量,利用这个命令来获取磁盘被占用了多少空间,,目前还剩下多少空间用法:df [-ahi ...

  6. iOS UI-九宫格

    第一节课: .复习 .运行App应用管理,简单界面分析 .一个应用为一个整体,直接创建一个appView然后计算frame .说明弊端,应该根据数据的个数来for循环创建 第二节课: .加载plist ...

  7. G1收集器

    转载:https://blog.csdn.net/zhou2s_101216/article/details/79202893 http://blog.jobbole.com/109170/ http ...

  8. 信号处理signal、sigaction、pause、信号嵌套处理、不可重入函数

    信号的捕捉和处理 主要由signal和sigaction函数来完成.还有一个函数pause,它可用来响应任何信号,不过不做任何处理. 1.signal函数 typedef void (*sighand ...

  9. learning shell get script absolute path (3)

    Shell get script absolute path [Purpose]        Get shell script absolute path   [Eevironment]       ...

  10. SSH框架下载地址

    Struts各版本下载地址: https://dist.apache.org/repos/dist/release/struts/ Spring各版本下载地址: http://repo.spring. ...