A Tiny Tower of Computation
阿新 • • 發佈:2018-12-13
def isOperand(token): if token in [str(i) for i in range(0, 10)]: return True return False def isOperator(token): if token in ['+', '-', '*', '/']: return True return False def cal(tokens): stack = [] for token in tokens: if isOperand(token): stack.append(token) elif isOperator(token): operand2 = stack.pop() operand1 = stack.pop() exp = str(operand1) + str(token) + str(operand2) result = eval(exp) stack.append(result) return stack[0] def trans(tokens): priority = {'+': 0, '-': 0, '*': 2, '/': 2, '(': 3} result = [] operators = [] for token in tokens: if isOperand(token): result.append(token) if token == '(': operators.append(token) if isOperator(token): for operator in operators[::-1]: if operator == '(': break if priority[token] <= priority[operator]: result.append(operators.pop()) else: break operators.append(token) if token == ')': for operator in operators[::-1]: if operator != '(': result.append(operators.pop()) else: operators.pop() break result.extend(reversed(operators)) return ' '.join(result) def main(): tokens = input("enter: ") print(trans(tokens)) if __name__ == '__main__': main()
計算字尾表示式
cal()函式計算字尾表示式的值。計算一個字尾表示式涉及三個步驟:
1. 從左到右遍歷表示式,將運算數加入棧中。
2. 遇到第一個運算子的時候,取出棧中的兩個運算數,對它們應用該運算子,將結果放入棧中。
3. 繼續遍歷,遍歷結束時棧中只剩下表示式的值。
中綴表示式轉字尾表示式
只要一遇到運算數,就將其加入字尾序列中。遇到運算子時,通常要加入一個棧中。但在加入之前,先將它之前所有具有較高優先順序的運算子轉移到字尾字串中。括號特殊處理:讀到左括號直接加入棧中,讀到右括號持續彈出直到遇到左括號(丟棄左括號)。