《Python数据结构和算法分析》第三弹——中序到后续转换
(1) 创建用于保存运算符的空栈opstack,以及一个用于保存结果的空列表。
(2) 使用字符串方法split将输入的中序表达式转换成一个列表。
(3) 从左往右扫描这个标记列表。
❏ 如果标记是操作数,将其添加到结果列表的末尾。
❏ 如果标记是左括号,将其压入opstack栈中。
❏ 如果标记是右括号,反复从opstack栈中移除元素,直到移除对应的左括号。将从栈中取出的每一个运算符都添加到结果列表的末尾。
❏ 如果标记是运算符,将其压入opstack栈中。但是,在这之前,需要先从栈中取出优先级更高或相同的运算符,并将它们添加到结果列表的末尾。
(4) 当处理完输入表达式以后,检查opstack。将其中所有残留的运算符全部添加到结果列表的末尾。
from pythonds.basic import Stack import string 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 string.ascii_uppercase: 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) A = "( A + B ) * ( C + D )" B = "( A + B ) * C" C = "A + B * C" print(infixToPostfix(A)) print(infixToPostfix(B)) print(infixToPostfix(C))

浙公网安备 33010602011771号