中缀表达式转换为后缀表达式(python实现)

中缀表示式转换为后缀表达式

需要一个存放操作符的栈op_stack,输出结果的列表output
步骤:
从左到右遍历表达式:
1. 若是数字,直接加入到output
2. 若是操作符,比较该操作符和op_stack中操作符的优先级,若优先级大于op_stack中的,则压入到op_stack中
    否则,将op_stack中优先级大于或等于该操作符优先级的所有操作符加入到output中,然后压入op_stack中
3. 若是左括号,压入到op_stack中
4. 若是右括号,将op_stack中所有左括号前面的操作符加入到output中
重复上面的步骤

后缀表达式求值

需要一个存放中间结果的栈num_stack
步骤:
从左到右遍历表达式:
1. 若是数字,压入到num_stack中
2. 若是操作符,取出num_stack中的前两个元素,第二个是表达式左边的操作数,计算表达式的值,将求值结果压入到num_stack中

python代码实现
from linked_stack import LinkedStack

def infix2postfix(expression):
    output = []
    op_stack = LinkedStack()
    op_priority = {‘*‘: 2, ‘/‘: 2, ‘%‘: 2, ‘+‘: 1, ‘-‘: 1, ‘(‘: 0, ‘)‘: 0}

    for e in expression:
        if e == ‘(‘:
            op_stack.push(e)
        elif e == ‘)‘:
            while op_stack.first() != ‘(‘:
                output.append(op_stack.pop())
            op_stack.pop()
        elif e.isdigit():
            output.append(e)
        else:
            while not op_stack.is_empty() and op_priority[op_stack.first()] >= op_priority[e]:
                output.append(op_stack.pop())
            op_stack.push(e) 

    while not op_stack.is_empty():
        output.append(op_stack.pop())

    return ‘‘.join(output)

def postfix_eval(expression):
    num_stack = LinkedStack()

    for e in expression:
        if e.isdigit():
            num_stack.push(e)
        else:
            num1 = num_stack.pop()
            num2 = num_stack.pop()
            res = eval(num2 + e + num1)
            num_stack.push(str(res))

    return num_stack.pop()    

if __name__ == "__main__":
    print(infix2postfix(‘2+(3+5)*(6+4)*(8+3)‘))
    print(postfix_eval(‘235+64+*83+*+‘))
完整的栈代码实现以及中缀表达式转换为前缀表达式可以参考xxpassswd github



原文地址:https://www.cnblogs.com/time-read/p/11022977.html

时间: 2024-12-22 04:49:19

中缀表达式转换为后缀表达式(python实现)的相关文章

将中缀表达式转换为后缀表达式,然后利用栈对表达式求值。

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js.js"></script> </head> <body> 输入中缀表达式空格分隔 例如 2 + 3 <input type=

中缀表达式转换为后缀表达式(1042)

描述 中缀表达式是一个通用的算术或逻辑公式表示方法,操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法.后缀表达式不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 *.利用栈结构,将中缀表达式转换为后缀表达式.(测试数据元素为单个字符) input 中缀表达式 output 后缀表达式 样例输入 A+(B-C/D)*E 样例输出 ABCD/-E

练习3.20 a 将中缀表达式转换为后缀表达式

//将中缀表达式转换为后缀表达式 int main() { int MaxSize = 10; int str[8]={3,3,2,1,0,1,0,2}; char tmp; PtrToStack s; s = CreateStack( MaxSize ); while(1) { tmp = getchar(); if(tmp == '\n') break; if(tmp == ' ') continue; else if(tmp == '+' || tmp == '-' || tmp == '

数据结构Java实现06----中缀表达式转换为后缀表达式

数据结构Java实现06----中缀表达式转换为后缀表达式 本文主要内容: 表达式的三种形式 中缀表达式与后缀表达式转换算法 一.表达式的三种形式: 中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3.我们从小做数学题时,一直使用的就是中缀表达式. 后缀表达式:不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则),如:2 1 + 3 *.又比如3+(6-4/2)*5=23的后缀表达式为:3642/-5*+# (#符号为结束符

中缀表达式转换为后缀表达式的算法

1.从左而右对算数表达式进行扫描,每次读入一个字符s1[i]: 2.若遇到数字或小数点,则立即写入s2[i],若遇算数运算符,将" "(空格)写入s2[i]: 3.遇到左括号"("则压栈: 4.若遇算术运算符,如果它们的优先级比栈顶元素高,则直接进栈,否则弹出栈顶元素输出到s2[i],直到新栈顶元素的优先级比它低,然后将它压栈: 5.若遇到右括号")",则将栈顶元素输出到s2[i],直到栈顶元素为"(",然后相互抵消:当扫描到

中缀表达式转换为后缀表达式

[转]中缀转换为后缀表达式 一.后缀表达式求值 后缀表达式也叫逆波兰表达式,其求值过程可以用到栈来辅助存储.假定待求值的后缀表达式为:6  5  2  3  + 8 * + 3  +  *,则其求值过程如下: 1)遍历表达式,遇到的数字首先放入栈中,此时栈如下所示: 2)接着读到"+",则弹出3和2,执行3+2,计算结果等于5,并将5压入到栈中. 3)读到8,将其直接放入栈中. 4)读到"*",弹出8和5,执行8*5,并将结果40压入栈中.而后过程类似,读到&quo

Java版 中缀表达式转换为后缀表达式并求结果

基础知识 平时我们所说的一个算术表达式,例如:9+(3-1)*3+10/2即为中缀表达式,然而计算机无法计算中缀表达式的值,这是因为计算机无法进行带有左右括号和运算符的优先级这种混合运算.后缀表达式(又称 逆波兰式)的使用解决了上述问题. 上述的算术表达式的后缀表达式为:9 3 1 - 3 * + 10 2 / + 算法思想 如何计算上述后缀表达式的结果呢? 答案:从左到右扫描上述后缀表达式,然后: 1. 遇到数字入栈 2. 遇到运算符 将栈顶的前两个元素出栈,然后计算结果,并将计算的结果入栈

js 中缀表达式转换为后缀表达式

算法叫逆波兰表达式逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出.逆波兰表达式又叫做后缀表达式.这个知识点在数据结构和编译原理这两门课程中都有介绍,下面是一些例子: 正常的表达式 逆波兰表达式 a+b ---> a,b,+ a+(b-c) ---> a,b,c,-,+ a+(b-c)d ---> a,d,b,c,-,,+ a=1+3 ---> a=1,3 + http=(smtp+http+telnet)/1024 写成什么呢? http=smtp,http,tel

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

中缀表达式与后缀表达式的转换和计算 目录 中缀表达式转换为后缀表达式 后缀表达式的计算 1 中缀表达式转换为后缀表达式 中缀表达式转换为后缀表达式的实现方式为: 依次获取中缀表达式的元素, 若元素为操作数(数字/字母等),则加入后缀表达式中 若元素为操作符,则压入栈中,此时对比入栈操作符与栈内元素的计算等级,等级大于或等于入栈元素的栈内操作符都将被弹出栈,加入到后缀表达式中 左括号直接入栈,优先级最高,不弹出栈内元素 右括号不入栈,而是弹出所有元素加入后缀表达式,直至遇见匹配的左括号,并弹出左括