中缀、前缀和后缀表达式
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 )"))
from pythonds.basic.stack import Stack def postfixEval(postfixExpr): operandStack = Stack() tokenList = postfixExpr.split() for token in tokenList: if token in '0123456789': operandStack.push(int(token)) else: operand2 = operandStack.pop() operand1 = operandStack.pop() result = doMath(token, operand1, operand2) operandStack.push(result) return operandStack.pop() def doMath(op, op1, op2): if op == '*': return op1 * op2 if op == '/': return op1 / op2 if op == '+': return op1 + op2 if op == '-': return op1 - op2 print(postfixEval('7 8 + 3 2 + /'))