逆波兰表达式主要有以下两个优点:
- 去掉括号后表达式无歧义,上式即便写成
1 2 + 3 4 + *也可以依据次序计算出正确结果。 - 适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中。
代码:
func evalRPN(tokens []string) int {
stu := make([]int, 0)
for _, v := range tokens {
if v == "+" {
t := stu[len(stu)-1] + stu[len(stu)-2]
stu = stu[:len(stu)-2]
stu = append(stu, t)
}else if v == "-" {
t := stu[len(stu)-2] - stu[len(stu)-1]
stu = stu[:len(stu)-2]
stu = append(stu, t)
}else if v == "*" {
t := stu[len(stu)-1] * stu[len(stu)-2]
stu = stu[:len(stu)-2]
stu = append(stu, t)
}else if v == "/" {
t := stu[len(stu)-2] / stu[len(stu)-1]
stu = stu[:len(stu)-2]
stu = append(stu, t)
}else {
t,_ := strconv.Atoi(v)
stu = append(stu, t)
}
}
return stu[0]
}
func evalRPN(tokens []string) int {
stack := []int{}
for _, token := range tokens {
val, err := strconv.Atoi(token)
if err == nil {
stack = append(stack, val)
} else {
num1, num2 := stack[len(stack)-2], stack[len(stack)-1]
stack = stack[:len(stack)-2]
switch token {
case "+":
stack = append(stack, num1+num2)
case "-":
stack = append(stack, num1-num2)
case "*":
stack = append(stack, num1*num2)
default:
stack = append(stack, num1/num2)
}
}
}
return stack[0]
}