题目要求输入一个中缀算术表达式,求解表达式的值。运算符包括 +、-、*、/、(、)和=,参加运算的数为正数且为double类型。(要求:直接针对中缀算术表达式进行计算,不能转换为后缀表达式再进行计算,只考虑二元运算即可。)
时间: 2023-12-19 14:04:15 浏览: 137
好的,下面是一个实现中缀表达式求值的示例代码,你可以参考一下:
```python
import re
def infix_eval(expression):
# 进行一些初始化工作
ops = [] # 运算符栈
values = [] # 操作数栈
priority = {'+': 1, '-': 1, '*': 2, '/': 2}
expression = re.sub(r'\s', '', expression) # 去除空格
# 遍历表达式
i = 0
while i < len(expression):
# 如果是数字,读取整个数值
if expression[i].isdigit() or expression[i] == '.':
j = i + 1
while j < len(expression) and (expression[j].isdigit() or expression[j] == '.'):
j += 1
values.append(float(expression[i:j]))
i = j
# 如果是左括号,将其压入栈
elif expression[i] == '(':
ops.append(expression[i])
i += 1
# 如果是右括号,执行括号中的操作
elif expression[i] == ')':
while ops[-1] != '(':
op = ops.pop()
val2 = values.pop()
val1 = values.pop()
values.append(apply_op(op, val1, val2))
ops.pop()
i += 1
# 如果是运算符
elif expression[i] in priority:
# 处理运算符优先级
while len(ops) != 0 and ops[-1] != '(' and priority[expression[i]] <= priority[ops[-1]]:
op = ops.pop()
val2 = values.pop()
val1 = values.pop()
values.append(apply_op(op, val1, val2))
# 将当前运算符压入栈
ops.append(expression[i])
i += 1
# 执行栈中的剩余操作
while len(ops) != 0:
op = ops.pop()
val2 = values.pop()
val1 = values.pop()
values.append(apply_op(op, val1, val2))
# 返回最终的结果
return values[0]
def apply_op(op, val1, val2):
if op == '+':
return val1 + val2
elif op == '-':
return val1 - val2
elif op == '*':
return val1 * val2
elif op == '/':
return val1 / val2
# 测试
print(infix_eval('1+2*3-4/2')) # 输出 5.0
```
这个代码使用了两个栈,一个用来存储运算符,另一个用来存储操作数。它遍历中缀表达式,并在遍历的过程中对栈进行操作,最终返回表达式的结果。
阅读全文