给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
示例 1:
输入:s = “3+2*2”
输出:7
示例 2:
输入:s = " 3/2 "
输出:1
示例 3:
输入:s = " 3+5 / 2 "
输出:5
首先 s一定是个正确的表达式,不存在4 / 0这样的式子
由于乘除优先于加减计算,因此不妨考虑先进行所有乘除运算,并将这些乘除运算后的整数值放回原表达式的相应位置,则随后整个表达式的值,就等于一系列整数加减后的值。基于此,我们可以用一个栈,保存这些(进行乘除运算后的)整数的值。对于加减号后的数字,将其直接压入栈中;对于乘除号后的数字,可以直接与栈顶元素计算,并替换栈顶元素为计算后的结果。
具体来说,遍历字符串,且初始化sign=’+’
1 遇到数字时,由于数字都是连续出现的才能形成一个数,因此需要设计一个不断遍历的机制把连续的数处理成一个number
2 当遇到运算符或者此时是最后一个字符,需要根据当前sign的类型判断对number的入栈(注意当前sign并不是当前字符):
加号:将number压入栈;
减号:将-number压入栈;
乘除号:计算number与栈顶元素运算的结果,并将栈顶元素替换为计算结果
最后,更新sign为当前遍历的字符。
3 将栈中元素累加,即为该字符串表达式的值。
时间复杂度O(n), 空间复杂度O(n)
class Solution:
def calculate(self, s: str) -> int:
sign = '+'
num = 0
stack = []
n = len(s)
for i in range(n):
elem = s[i]
if (elem in '0123456789') and elem != ' ':
num = 10*num + int(elem)
if (elem in '+-*/') or (i == n - 1):
if sign == '+':
stack.append(num)
elif sign == '-':
stack.append(-num)
elif sign == '*':
stack[-1] = num * stack[-1]
else:
stack[-1] = int(stack[-1] / num)
sign = elem
num = 0
return sum(stack)