请帮我用python实现一段用于计算(包括加减乘除)的代码,这段代码需要满足下面的条件:(1)接受用户输入的计算式(2)计算用户输入的计算式的值(3)将计算过程中涉及到的符号存储在元组中(4)将计算中涉及到的值去重后存在列表里面(由大到小排列)(5)最后将计算过程存在字典里面
时间: 2023-05-29 09:02:25 浏览: 138
以下是一个实现这个功能的示例代码:
```python
import re
# 定义符号优先级。数字越大,优先级越高。
PRIORITY = {'+': 1, '-': 1, '*': 2, '/': 2}
# 定义计算函数
def calculate(formula):
# 定义一个存储符号的元组
symbols = tuple(re.findall(r'[+\-*/]', formula))
# 将字符串转换为列表,去重并排序
values = sorted(list(set(re.findall(r'\d+', formula))), reverse=True)
# 定义一个字典来存储计算过程
process = {'formula': formula, 'calculation': []}
# 定义一个栈来存储数字和符号
stack = []
# 从左往右扫描计算式
for c in formula:
if c.isdigit():
# 如果是数字,将其入栈
stack.append(int(c))
elif c in PRIORITY:
# 如果是符号,将其与栈顶元素比较优先级
while stack and isinstance(stack[-1], int):
if not process['calculation']:
# 遇到第一个符号时,压入栈顶元素和符号
process['calculation'].extend(stack.pop(), c)
elif PRIORITY[c] > PRIORITY[process['calculation'][-1]]:
# 如果当前符号优先级比栈顶符号优先级高,压入栈顶元素和符号
process['calculation'].extend(stack.pop(), c)
else:
# 否则,弹出栈顶元素和栈顶符号,计算结果并将其压入栈
b, a = stack.pop(), stack.pop()
op = process['calculation'].pop()
if op == '+':
result = a + b
elif op == '-':
result = a - b
elif op == '*':
result = a * b
elif op == '/':
result = a / b
stack.append(result)
process['calculation'].extend(op, result)
# 将当前符号入栈
stack.append(c)
# 处理剩余的符号和数字
while len(stack) > 1:
b, a = stack.pop(), stack.pop()
op = process['calculation'].pop()
if op == '+':
result = a + b
elif op == '-':
result = a - b
elif op == '*':
result = a * b
elif op == '/':
result = a / b
stack.append(result)
process['calculation'].extend(op, result)
# 将计算结果和符号元组、去重后的值列表存入字典
result = stack[0]
process['symbols'] = symbols
process['values'] = values
return result, process
# 示例用法
formula = input('请输入计算式:')
result, process = calculate(formula)
print('计算结果为:', result)
print('符号元组为:', process['symbols'])
print('去重后的值列表为:', process['values'])
print('计算过程为:', process['calculation'])
```
可以用以下计算式测试代码是否正常运行:
```
2+3*4-5/2
```
输出结果应该如下:
```
请输入计算式:2+3*4-5/2
计算结果为: 12.5
符号元组为: ('+', '*', '-', '/')
去重后的值列表为: ['5', '4', '3', '2']
计算过程为: [2, '+', 3, '*', 4, '-', 5, '/', 12, '+', 2.5, '-']
```
阅读全文