后缀表达式

149 阅读1分钟

image.png

逆波兰表达式主要有以下两个优点:

  • 去掉括号后表达式无歧义,上式即便写成 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]
}