题目描述:具体描述见原题。简单来说就是计算逆波兰表达式的值。
解题思路:对已经构造完成的逆波兰表达式求值其实是栈的最基本应用之一。数值入栈,遇到操作符取栈顶两个数值作为操作数计算,计算结果入栈,注意操作数顺序,stack[-2]为左操作数,stack[-1]为右操作数。具体过程见代码。
具体代码:
func evalRPN(tokens []string) int {
if len(tokens) == 1 {
i, _ := strconv.Atoi(tokens[0])
return i
}
stack, top := make([]int, 0), 0 // top一直代表栈顶位置
for _, v := range tokens {
switch v {
case "*":
{
mul := stack[top-2] * stack[top-1]
stack = stack[:top-2]
stack = append(stack, mul)
top--
}
case "/":
{
div := stack[top-2] / stack[top-1]
stack = stack[:top-2]
stack = append(stack, div)
top--
}
case "+":
{
sum := stack[top-2] + stack[top-1] // 遇到操作符取栈顶两数计算
stack = stack[:top-2] // 两个计算数出栈
stack = append(stack, sum) // 计算结果入栈
top-- // 相当于维护栈顶位置
}
case "-":
{
sub := stack[top-2] - stack[top-1]
stack = stack[:top-2]
stack = append(stack, sub)
top--
}
default:
{
i, _ := strconv.Atoi(v)
stack = append(stack, i) // 操作数一直入栈
top++ // 维护栈顶位置
}
}
}
return stack[0]
}
补充说明:对已知后缀表达式求值大多数情况下只是整个流程最后一步,在此之前常见过程是通过中缀表达式构造后缀表达式,构造过程其实也是栈的应用之一。