📜  从给定的字符串计算括号的分数(1)

📅  最后修改于: 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()函数是整个算法的入口。