这个题解使用了一个栈来模拟计算过程。遍历字符串 s 中的每个字符,如果当前字符是数字,则更新当前数 cur;如果当前字符是运算符,则根据上一个运算符 op 来决定如何处理当前数,并更新上一个运算符为当前运算符。具体来说:
1. 如果上一个运算符是加号,则将当前数压入栈;
2. 如果上一个运算符是减号,则将当前数的相反数压入栈;
3. 如果上一个运算符是乘号,则将栈顶元素弹出,与当前数相乘后压入栈;
4. 如果上一个运算符是除号,则将栈顶元素弹出,与当前数相除后压入栈,注意处理除数为负数的情况。
最后将栈中所有元素求和即为最终结果。
时间复杂度: O(n)
空间复杂度: O(n)
class Solution:
def calculate(self, s: str) -> int:
nums = []
cur = 0
op = "+"
for i in s+"+":
if i.isdigit():
# 如果当前字符是数字,则更新当前数 cur
cur = cur*10+int(i)
elif i in "+-*/":
# 如果当前字符是运算符,则根据上一个运算符 op 来决定如何处理当前数
if op == "+":
nums.append(cur)
elif op =="-":
nums.append(-cur)
elif op == '*':
nums[-1] = nums[-1]*cur
# nums.append(nums.pop()*cur)
elif op == "/":
if nums[-1]>0:
nums[-1] = nums[-1]//cur
else:
nums[-1] = 0-(abs(nums[-1])//cur)
# 更新上一个运算符为当前运算符
op = i
# 重置当前数为 0
cur = 0
print(nums)
# 返回栈中所有元素的和
return sum(nums)