func calculate(s string) int {
dataStack := []int{}
opStack := []byte{}
for i := 0; i < len(s); i++ {
b := s[i]
if b == ' ' {
continue
}
if judgeNum(b) {
v := 0
for ; i < len(s) && s[i] >= '0' && s[i] <= '9'; i++ {
v = v*10 + int(s[i]-'0')
}
i--
dataStack = append(dataStack, v)
} else {
for len(opStack) > 0 && priority(b) <= priority(opStack[len(opStack)-1]) {
op := opStack[len(opStack)-1]
opStack = opStack[:len(opStack)-1]
data1, data2 := dataStack[len(dataStack)-2], dataStack[len(dataStack)-1]
dataStack = dataStack[:len(dataStack)-2]
dataStack = append(dataStack, compute(data1, data2, op))
}
opStack = append(opStack, b)
}
}
//opStack 中的运算符优先级一次降低
for len(opStack) != 0 {
op := opStack[len(opStack)-1]
opStack = opStack[:len(opStack)-1]
data1, data2 := dataStack[len(dataStack)-2], dataStack[len(dataStack)-1]
dataStack = dataStack[:len(dataStack)-2]
dataStack = append(dataStack, compute(data1, data2, op))
}
return dataStack[0]
}
func judgeNum(b byte) bool {
return b >= '0' && b <= '9'
}
func compute(data1, data2 int, op byte) int {
switch op {
case '+':
return data1 + data2
case '-':
return data1 - data2
case '*':
return data1 * data2
case '/':
return data1 / data2
}
return 0
}
func priority(op byte) int {
switch op {
case '+':
return 0
case '-':
return 0
case '*':
return 1
case '/':
return 1
}
return 0
}
算法课-计算器-力扣
最新推荐文章于 2024-07-24 11:46:15 发布