📅  最后修改于: 2023-12-03 14:49:27.908000             🧑  作者: Mango
在该算法题目中,给定一个只包含数字、加号、减号、乘号、左括号和右括号的字符串,其中每个括号后面跟着一个整数。请你计算并返回该表达式的值。
这道题目中,括号表示的是优先级,括号内的优先级最高,每一层的括号优先级逐渐降低。也就是说,括号嵌套的深度越深,计算优先级就越高。
处理括号运算的过程通常使用“栈”这种数据结构来解决。
我们维护一个operand栈来存储每个表达式中的数字运算,还需要维护一个operator栈来存储表达式中的操作符,拿到每个括号里面的内容,就将括号里的内容组合起来,作为一个表达式,使用递归的方式求解表达式的值。
遍历字符串中的每个字符,当遇到数字字符时,先将其转换成数字。对于遇到的操作符,如果操作符的优先级小于或等于operator栈顶的操作符,则从operand栈中取出两个数字,从operator栈中取出一个操作符并计算它们,将结果压入operand栈中,然后将当前操作符压入operator栈中。否则,将当前数字和操作符分别压入operand和operator栈中。
需要注意的是,在最后要清空栈,并将operand栈中的数字加起来得到答案。
def calculate(s: str) -> int:
def helper(index):
operands = []
operators = []
while index < len(s):
c = s[index]
if c == ' ':
pass
elif c.isdigit():
curr = int(c)
while index + 1 < len(s) and s[index + 1].isdigit():
curr = curr * 10 + int(s[index + 1])
index += 1
operands.append(curr)
elif c == '(':
value, index = helper(index + 1)
operands.append(value)
elif c in '+-*/':
while operators and precedence[operators[-1]] >= precedence[c]:
b, a = operands.pop(), operands.pop()
op = operators.pop()
operands.append(calculate_op(a, b, op))
operators.append(c)
elif c == ')':
break
index += 1
while operators:
b, a = operands.pop(), operands.pop()
op = operators.pop()
operands.append(calculate_op(a, b, op))
return operands[0], index
def calculate_op(a, b, op):
if op == '+':
return a + b
elif op == '-':
return a - b
elif op == '*':
return a * b
elif op == '/':
return a // b
precedence = {'+': 1, '-': 1, '*': 2, '/': 2}
return helper(0)[0]
代码中的helper()函数用来递归计算各个表达式的值;calculate()函数是整个算法的入口。