def infix_evaluator(infix_expression: str): token_list = infix_expression.split() print(token_list) pre_dict = {'*': 2, '/': 2, '+': 1, '-': 1} ope_stack = [] num_stack = [] for i in token_list: if i.isdecimal() or '.' in i: num_stack.append(float(i)) elif i in '+-*/': while ope_stack and pre_dict[ope_stack[-1]] >= pre_dict[i]: top = ope_stack.pop() op2 = num_stack.pop() op1 = num_stack.pop() num_stack.append(get_value(top, op1, op2)) ope_stack.append(i) while ope_stack: top = ope_stack.pop() op2 = ope_stack.pop() op1 = ope_stack.pop() ope_stack.append(get_value(top, op1, op2)) return ope_stack[0] def get_value(operator, op1, op2): if operator == '+': return op1 + op2 elif operator == '-': return op1 - op2 elif operator == '*': return op1 * op2 elif operator == '/': return op1 / op2 print(infix_evaluator('2.5 - 3 * 4'))
时间: 2024-02-14 21:20:36 浏览: 98
这段代码实现了一个中缀表达式求值的函数。函数的输入是一个中缀表达式字符串 `infix_expression`,输出是表达式的计算结果。
函数首先将输入的字符串按照空格进行切分,得到一个包含多个操作数和运算符的列表 `token_list`。然后,函数定义了一个字典 `pre_dict`,用于保存每个运算符的优先级。接下来,函数创建了两个栈 `ope_stack` 和 `num_stack`,用于分别存储运算符和操作数。
函数遍历 `token_list` 列表中的每个元素 `i`,如果 `i` 是一个数字,则将其转化为浮点数后压入 `num_stack` 栈中。如果 `i` 是一个运算符,则将其与 `ope_stack` 栈顶的运算符进行比较,如果 `i` 的优先级低于或等于栈顶运算符的优先级,则需要先计算栈顶运算符的结果。具体地,函数从 `ope_stack` 栈顶弹出一个运算符 `top`,从 `num_stack` 栈顶弹出两个操作数 `op1` 和 `op2`,然后调用 `get_value()` 函数计算出 `top` 运算符的结果,并将结果压入 `num_stack` 栈中。循环执行这个过程,直到 `i` 的优先级大于栈顶运算符的优先级,或者 `ope_stack` 栈为空。
当遍历完 `token_list` 列表后,`ope_stack` 中可能还有一些未处理的运算符和操作数,需要进行最后的计算。函数从 `ope_stack` 栈中弹出一个运算符 `top`,从 `num_stack` 栈顶弹出两个操作数 `op1` 和 `op2`,然后调用 `get_value()` 函数计算出 `top` 运算符的结果,并将结果压入 `ope_stack` 栈中。循环执行这个过程,直到 `ope_stack` 栈中只剩下一个元素,即表达式的计算结果。最后,函数返回 `ope_stack` 栈中的计算结果。
在本例中,我们调用 `infix_evaluator()` 函数,传入参数 `'2.5 - 3 * 4'`,函数输出结果为 `-9.5`。
阅读全文