【剑指offer】AB4 逆波兰表达式求值 [Go语言]

146 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

描述

给定一个逆波兰表达式,求表达式的值。

数据范围:表达式长度满足1≤n≤104  ,表达式中仅包含数字和 + ,- , * , / ,其中数字的大小满足 0 ≤∣val∣≤200 。

示例1

输入:

["2","1","+","4","*"]

返回值:

12

示例2

输入:

["2","0","+"]

返回值:

2

思路

其实就是一个栈的简单应用,遇到数字就入栈,遇到运算符就计算出栈,最终保留结果。

AC Code

package main
import "strconv"

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param tokens string字符串一维数组 
 * @return int整型
*/
func evalRPN( tokens []string ) int {
    // write code here
(1)    if len(tokens)<3{
(2)        ans,_:=strconv.Atoi(tokens[0])
(3)        return ans
    }
    ans := make([]int,0)
(4)    for _,t:=range tokens{
        switch t {
(5)            case "+":
                ans[len(ans)-2]+=ans[len(ans)-1]
                ans=ans[:len(ans)-1]
(6)            case "-":
                ans[len(ans)-2]-=ans[len(ans)-1]
                ans = ans[:len(ans)-1]
(7)            case "*":
                ans[len(ans)-2]*=ans[len(ans)-1]
                ans=ans[:len(ans)-1]
(8)            case "/":
                ans[len(ans)-2]/=ans[len(ans)-1]
                ans = ans[:len(ans)-1]
(9)            default:
                a,_ := strconv.Atoi(t)
                ans = append(ans, a)
        }
    }
(10)    return ans[0]
}
  • (1) 如果这里小于三个字符,就直接返回第一个数字即可
  • (2) 转化成整型
  • (3) 返回答案
  • (4) 遍历这个tokens,对每一个值进行计算处理
  • (5) 如果是+号就对前后数组进行相加,并且赋值给第一个数
  • (6) 如果是-号就对前后数组进行相减,并且赋值给第一个数
  • (7) 如果是*号就对前后数组进行相乘,并且赋值给第一个数
  • (8) 如果是/号就对前后数组进行相除,并且赋值给第一个数
  • (9) 如果都不是的话,就说明这是值就直接压入栈中
  • (10) 最后返回栈里只有一个元素,就是我们的值了