面试题 16.26. 计算器
给定一个包含正整数、加(+)、减(-)、乘(*)、除(/)的算数表达式(括号除外),计算其结果。
表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。
示例 1:
输入: "3+2*2"
输出: 7
示例 2:
输入: " 3/2 "
输出: 1
示例 3:
输入: " 3+5 / 2 "
输出: 5
说明:
你可以假设所给定的表达式都是有效的。
请不要使用内置的库函数 eval。
func isDigit(s string, i int) (int, bool) {
if i > len(s)-1 {
return 0, false
}
if s[i]>='0' && s[i]<='9' {
tmp := s[i] - '0'
return int(tmp), true
}
return 0, false
}
func calculate(s string) int {
stack := []int{}
var cur int
var pre byte = '+'
var res int
for i:=0; i<=len(s); i++ {
tmp, ok := isDigit(s, i)
if ok {
cur = cur * 10 + tmp
} else if i<len(s) && s[i] == ' '{
continue
} else {
switch pre {
case '+':
stack = append(stack, cur)
case '-':
stack = append(stack, -cur)
case '*':
topnum := stack[len(stack)-1]
stack = stack[:len(stack)-1]
num := topnum * cur
stack = append(stack, num)
case '/':
topnum := stack[len(stack)-1]
stack = stack[:len(stack)-1]
num := topnum / cur
stack = append(stack, num)
}
cur = 0
if i < len(s) {
pre = s[i]
}
}
}
for _,v := range stack {
res = res + v
}
return res
}