关键点在于,我们借助两个栈,一个栈存放操作数,一个栈存放运算符。每次计算都是从运算符栈弹出一个运算符,从操作数栈弹出两个操作数,计算后的结果压回操作数栈。
输入以空格隔开。
def get_value(operator, num1, num2):'''实现两个数的四则运算'''if operator == '+':return num1 + num2elif operator == '-':return num1 - num2elif operator == '*':return num1 * num2elif operator == '/':return num1 / num2def infix_evaluator(infix_expression: str) -> int:""" 中缀表达式函数求值 """token_list = infix_expression.split()operator_priority = {'*': 3, '/': 3, '+': 2, '-': 2, '(': 1}digital_stack = []operator_stack = []for token in token_list:if token.isdecimal() or token[1:].isdecimal():# 正数、负数都入栈digital_stack.append(int(token))elif token == '(':operator_stack.append(token)elif token == ')':# 碰到右括号,把栈顶左括号上面的运算符都出栈top = operator_stack.pop()while top != '(':op1 = digital_stack.pop()op2 = digital_stack.pop() # 弹出两个数用于计算tmp_ans = get_value(top, op1, op2)digital_stack.append(tmp_ans)top = operator_stack.pop() # 弹出下一个栈顶运算符elif token in '+-*/':# 比较当前运算符token与opeartor_stack栈顶中运算符的优先级# 如果栈顶优先级相等或较高,则可以执行两数运算while operator_stack and operator_priority[operator_stack[-1]] >= operator_priority[token]:top = operator_stack.pop()op2 = digital_stack.pop()op1 = digital_stack.pop()tmp_ans = get_value(top, op1, op2)digital_stack.append(tmp_ans)operator_stack.append(token)# 表达式遍历完,栈里剩下的操作符也要求值while operator_stack:top = operator_stack.pop()op2 = digital_stack.pop()op1 = digital_stack.pop()digital_stack.append(get_value(top, op1, op2))return digital_stack[0]if __name__ == '__main__':s = input()print(infix_evaluator(s))
