1. 程式人生 > >A Tiny Tower of Computation

A Tiny Tower of Computation

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. 繼續遍歷,遍歷結束時棧中只剩下表示式的值。

中綴表示式轉字尾表示式

只要一遇到運算數,就將其加入字尾序列中。遇到運算子時,通常要加入一個棧中。但在加入之前,先將它之前所有具有較高優先順序的運算子轉移到字尾字串中。括號特殊處理:讀到左括號直接加入棧中,讀到右括號持續彈出直到遇到左括號(丟棄左括號)。