题目:
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。
注意: 不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。
解法:
思路:先进行乘除法,再进行加减法。乘除法是二目操作,检查数字的前一个sign和前一个数字。
当数字结束时(出现新的sign字符,或者str结束)触发检查,检查进行乘除法运算。
测试驱动边界条件: 1.非个位数数字,1+22 2.空格 1 + 22 3.最后一位数字的时候检查sign操作符
func calculate(str string) int {
numStack := make([]int, 0)
preSign := '+'
num := 0
for i, char := range str {
isDigtal := '0' <= char && char <= '9'
if isDigtal {
num = num * 10 + int(char - '0')
}
if !isDigtal && char != ' ' || i == len(str) - 1{
switch preSign {
case '-':
numStack = append(numStack, -1 * num)
case '+':
numStack = append(numStack, num)
case '*':
lastNum := numStack[len(numStack)-1]
numStack = numStack[:len(numStack)-1]
numStack = append(numStack, lastNum * num)
case '/':
lastNum := numStack[len(numStack)-1]
numStack = numStack[:len(numStack)-1]
numStack = append(numStack, lastNum / num)
}
preSign = char
num = 0
}
}
ans := 0
for i := range numStack {
ans += numStack[i]
}
return ans
}