关键点在于,我们借助两个栈,一个栈存放操作数,一个栈存放运算符。每次计算都是从运算符栈弹出一个运算符,从操作数栈弹出两个操作数,计算后的结果压回操作数栈。

    输入以空格隔开。

    1. def get_value(operator, num1, num2):
    2. '''实现两个数的四则运算'''
    3. if operator == '+':
    4. return num1 + num2
    5. elif operator == '-':
    6. return num1 - num2
    7. elif operator == '*':
    8. return num1 * num2
    9. elif operator == '/':
    10. return num1 / num2
    11. def infix_evaluator(infix_expression: str) -> int:
    12. """ 中缀表达式函数求值 """
    13. token_list = infix_expression.split()
    14. operator_priority = {'*': 3, '/': 3, '+': 2, '-': 2, '(': 1}
    15. digital_stack = []
    16. operator_stack = []
    17. for token in token_list:
    18. if token.isdecimal() or token[1:].isdecimal():
    19. # 正数、负数都入栈
    20. digital_stack.append(int(token))
    21. elif token == '(':
    22. operator_stack.append(token)
    23. elif token == ')':
    24. # 碰到右括号,把栈顶左括号上面的运算符都出栈
    25. top = operator_stack.pop()
    26. while top != '(':
    27. op1 = digital_stack.pop()
    28. op2 = digital_stack.pop() # 弹出两个数用于计算
    29. tmp_ans = get_value(top, op1, op2)
    30. digital_stack.append(tmp_ans)
    31. top = operator_stack.pop() # 弹出下一个栈顶运算符
    32. elif token in '+-*/':
    33. # 比较当前运算符token与opeartor_stack栈顶中运算符的优先级
    34. # 如果栈顶优先级相等或较高,则可以执行两数运算
    35. while operator_stack and operator_priority[operator_stack[-1]] >= operator_priority[token]:
    36. top = operator_stack.pop()
    37. op2 = digital_stack.pop()
    38. op1 = digital_stack.pop()
    39. tmp_ans = get_value(top, op1, op2)
    40. digital_stack.append(tmp_ans)
    41. operator_stack.append(token)
    42. # 表达式遍历完,栈里剩下的操作符也要求值
    43. while operator_stack:
    44. top = operator_stack.pop()
    45. op2 = digital_stack.pop()
    46. op1 = digital_stack.pop()
    47. digital_stack.append(get_value(top, op1, op2))
    48. return digital_stack[0]
    49. if __name__ == '__main__':
    50. s = input()
    51. print(infix_evaluator(s))