时间复杂度:O(n)
解题思路
记录所有值的前缀计算符号,如果是加减号就让值入栈,但减号必须是相反数入栈,如果是乘除就更新栈顶值进行相应乘除运算,然后更新前缀符号。栈用来保存所有乘除运算后的值。当遍历完字符串后,遍历栈中所有值,进行加法运算,最后的和就是运算结果。
AC代码
func calculate(s string) int {
stk:=[]int{}
pre:='+'
num:=0
for i:=0;i<len(s);i++{
isDigit:=s[i]>='0'&&s[i]<='9'
if isDigit{
num=num*10+int(s[i]-'0')
}
if !isDigit&&s[i]!=' '||i==len(s)-1{
switch pre{
case '+':
stk=append(stk,num)
case '-':
stk=append(stk,-num)
case '*':
stk[len(stk)-1]*=num
case '/':
stk[len(stk)-1]/=num
}
pre=rune(s[i])
num=0
}
}
for i:=1;i<len(stk);i++{
stk[0]+=stk[i]
}
return stk[0]
}
感悟
一开始想用符号栈和整数栈实现,但是同级运算的结果不正确。看了题解后发现只用整数栈即可,但需要记录所有值的前缀符号。特别要注意要略过空格,否则会出现0作为除数的情况发生。