用户从键盘输入一个算术表达式,数字都是十进制整型(必须支持负数),运算符支持+-*/()。
时间: 2024-05-06 19:18:15 浏览: 142
计算器(支持+,-,*,/)运算
好的,这个问题可以使用栈和逆波兰表达式来解决。以下是一个简单的Python实现:
```python
def infix_to_postfix(expr):
"""
将中缀表达式转换为后缀表达式
"""
prec = {'+': 1, '-': 1, '*': 2, '/': 2, '(': 0}
op_stack = []
postfix_list = []
token_list = expr.split()
for token in token_list:
if token.isdigit() or token[0] == '-' and token[1:].isdigit():
postfix_list.append(token)
elif token == '(':
op_stack.append(token)
elif token == ')':
top_token = op_stack.pop()
while top_token != '(':
postfix_list.append(top_token)
top_token = op_stack.pop()
else:
while op_stack and prec[op_stack[-1]] >= prec[token]:
postfix_list.append(op_stack.pop())
op_stack.append(token)
while op_stack:
postfix_list.append(op_stack.pop())
return ' '.join(postfix_list)
def eval_postfix(expr):
"""
计算后缀表达式的值
"""
operand_stack = []
token_list = expr.split()
for token in token_list:
if token.isdigit() or token[0] == '-' and token[1:].isdigit():
operand_stack.append(int(token))
else:
operand2 = operand_stack.pop()
operand1 = operand_stack.pop()
result = do_math(token, operand1, operand2)
operand_stack.append(result)
return operand_stack.pop()
def do_math(op, operand1, operand2):
"""
执行数学运算
"""
if op == '+':
return operand1 + operand2
elif op == '-':
return operand1 - operand2
elif op == '*':
return operand1 * operand2
else:
return operand1 / operand2
expr = input("请输入算术表达式:")
postfix_expr = infix_to_postfix(expr)
result = eval_postfix(postfix_expr)
print("计算结果为:", result)
```
这个程序首先将中缀表达式转换为后缀表达式,然后计算后缀表达式的值。转换中缀表达式为后缀表达式的部分使用了栈的数据结构。在计算后缀表达式的值时,我们也使用了栈来保存操作数。
阅读全文