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

Posted time-read

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了中缀表达式转换为后缀表达式(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




以上是关于中缀表达式转换为后缀表达式(python实现)的主要内容,如果未能解决你的问题,请参考以下文章

如何在程序中将中缀表达式转换为后缀表达式

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

中缀表达式如何转换为前后缀表达式?

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

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

python数据结构 栈的实例 表达式转换 中缀转前缀后缀