📜  资质|算术能力6 |问题2(1)

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

资质|算术能力6 |问题2
问题描述

给定一个字符串,其中包含正整数、负整数、加号 + 和减号 -,请编写一个函数,计算该表达式的值。

例如:

calculate("1 + 2") // 3
calculate("2-1 + 2 ") // 3
calculate("(1+(4+5+2)-3)+(6+8)") // 23

注意:

  • 该字符串不包含任何括号。
  • 运算符加号 + 和减号 - 占据一个字符的位置。
  • 所有整数都是正数或负数。
解题思路

可以使用栈来模拟计算过程,遍历字符串时,将数字和运算符压入栈中,遇到运算符时,从栈中弹出两个数字进行运算,并把新的结果压回栈中。当遍历完字符串时,栈里只剩下一个值,即表达式的结果。

需要注意的是,字符串中可能存在连续的数字,需要考虑将它们合并成一个整数。

代码实现
def calculate(s: str) -> int:
    stack = []
    num = 0
    sign = "+"
    for i in range(len(s)):
        if s[i].isdigit():
            num = num * 10 + int(s[i])
        if (not s[i].isdigit() and not s[i].isspace()) or i == len(s) - 1:
            if sign == "+":
                stack.append(num)
            elif sign == "-":
                stack.append(-num)
            elif sign == "*":
                stack.append(stack.pop() * num)
            else:
                stack.append(int(stack.pop() / num))
            sign = s[i]
            num = 0
    return sum(stack)
总结

本题主要考察对栈的理解和处理问题的能力,需要注意字符串中连续数字的处理。时间复杂度为 O(n),空间复杂度为 O(n)。