📜  门| GATE-CS-2003 |第 90 题(1)

📅  最后修改于: 2023-12-03 14:58:25.392000             🧑  作者: Mango

GATE-CS-2003 | 第 90 题

该题目要求我们实现一个计算器,支持基本的四则运算和括号。给出的表达式中只包含数字、加减乘除、左右括号。

解题思路

本题的解法有很多,这里我们介绍一种比较常见的做法。

首先,我们需要一个数据结构来存储表达式。可以使用一个栈来实现逆波兰表达式。

然后,我们遍历表达式中的每个字符,如果遇到数字,就入栈;如果遇到操作符,就将操作数出栈,进行相应的计算,结果再次入栈;如果遇到左括号,就入栈;如果遇到右括号,就不断出栈,直到遇到左括号,然后将括号内的表达式计算出来,结果入栈。

最后,栈中剩下的元素就是我们要求的结果。

代码实现
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

以上就是本题的解法和代码实现了。