227.基本计算器 II

93 阅读1分钟

题目:
给你一个字符串表达式 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
}