📅  最后修改于: 2023-12-03 14:58:25.392000             🧑  作者: Mango
该题目要求我们实现一个计算器,支持基本的四则运算和括号。给出的表达式中只包含数字、加减乘除、左右括号。
本题的解法有很多,这里我们介绍一种比较常见的做法。
首先,我们需要一个数据结构来存储表达式。可以使用一个栈来实现逆波兰表达式。
然后,我们遍历表达式中的每个字符,如果遇到数字,就入栈;如果遇到操作符,就将操作数出栈,进行相应的计算,结果再次入栈;如果遇到左括号,就入栈;如果遇到右括号,就不断出栈,直到遇到左括号,然后将括号内的表达式计算出来,结果入栈。
最后,栈中剩下的元素就是我们要求的结果。
def calculate(expr):
# 将中缀表达式转换为后缀表达式
postfix = []
opstack = []
for ch in expr:
if ch.isdigit():
postfix.append(ch)
elif ch in '()+-*/':
while opstack and opstack[-1] != '(' and priority[opstack[-1]] >= priority[ch]:
postfix.append(opstack.pop())
if ch == ')':
while opstack and opstack[-1] != '(':
postfix.append(opstack.pop())
opstack.pop() # 弹出左括号
else:
opstack.append(ch)
while opstack:
postfix.append(opstack.pop())
# 计算后缀表达式的值
valstack = []
for ch in postfix:
if ch.isdigit():
valstack.append(int(ch))
else:
b = valstack.pop()
a = valstack.pop()
if ch == '+':
valstack.append(a + b)
elif ch == '-':
valstack.append(a - b)
elif ch == '*':
valstack.append(a * b)
elif ch == '/':
valstack.append(a // b)
return valstack[0]
# 运算符的优先级 (越大优先级越高)
priority = {
'+': 1, '-': 1,
'*': 2, '/': 2
}
# 测试代码
print(calculate('2*(3+4)')) # 14
print(calculate('(2+3)*(4+5)')) # 45
以上就是本题的解法和代码实现了。