leetcode-150

181 阅读1分钟

题目描述:具体描述见原题。简单来说就是计算逆波兰表达式的值。

解题思路:对已经构造完成的逆波兰表达式求值其实是栈的最基本应用之一。数值入栈,遇到操作符取栈顶两个数值作为操作数计算,计算结果入栈,注意操作数顺序,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]
}

补充说明:对已知后缀表达式求值大多数情况下只是整个流程最后一步,在此之前常见过程是通过中缀表达式构造后缀表达式,构造过程其实也是栈的应用之一。