中缀、前缀和后缀表达式

  1. 前缀表达式符号要求所有运算符在它们处理的两个操作数之前。

  2. 后缀表达式要求其操作符在相应的操作数之后。

考虑表达式 A + B * C , A B C * + 是等价的后缀表达式。操作数 A,B 和 C 保持在它们的相对位置,只有操作符改变位置。

原始表达式中的运算符的顺序在生成的后缀表达式中相反。由于这种顺序的反转,考虑使用栈来保存运算符

当我们处理表达式时,操作符必须保存在某处,因为它们相应的右操作数还没有看到。

 

from pythonds.basic.stack import Stack

def infixToPostfix(infixexpr):
    prec = {}
    prec['*'] = 3       # 定义运算符的优先顺序
    prec['/'] = 3
    prec['+'] = 2
    prec['-'] = 2
    prec['('] = 1
    opStack = Stack()   # 创建一个空栈
    postfixList = []
    tokenList = infixexpr.split()

    for token in tokenList:
        if token in 'ABCDEFGHIJKLMNOPQISTUVWXYZ' or token in '0123456789':
            postfixList.append(token)
        elif token == '(':
            opStack.push(token)
        elif token == ')':
            topToken = opStack.pop()
            while topToken != '(':
                postfixList.append(topToken)
                topToken = opStack.pop()
        else:
            while (not opStack.isEmpty()) and (prec[opStack.peek()] >= prec[token]):
                postfixList.append(opStack.pop())
            opStack.push(token)
    while not opStack.isEmpty():
            postfixList.append(opStack.pop())
    return ''.join(postfixList)

print(infixToPostfix("A * B + C * D"))
print(infixToPostfix("( A + B ) * C - ( D - E ) * ( F + G )"))
中缀转换成后缀

相关文章: