Go语言学习之力扣-逆波兰表达式|Go主题月

1,081 阅读3分钟

作者:看那个码农

公众号:看那个码农

上期内容介绍了Go语言学习之流程控制|Go主题月

  • 流程控制的定义
  • 使用if语句
  • 使用for语句
  • 使用switch语句
  • 使用defer语句
  • 使用break语句
  • 使用continue语句

本篇内容将继续带领大家走进Go语言的世界。

1.本文简介

Go语言学习之力扣-逆波兰表达式

来源于:Leetcode150.逆波兰表达式求值

2.题目描述:

根据 逆波兰表示法,求表达式的值。

有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。

说明:

整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。

示例 1

输入:tokens = ["2","1","+","3","*"]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9

示例 2

输入:tokens = ["4","13","5","/","+"]
输出:6
解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6

示例 3

输入:tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]
输出:22
解释:
该算式转化为常见的中缀算术表达式为:
  ((10 * (6 / ((9 + 3) * -11))) + 17) + 5
= ((10 * (6 / (12 * -11))) + 17) + 5
= ((10 * (6 / -132)) + 17) + 5
= ((10 * 0) + 17) + 5
= (0 + 17) + 5
= 17 + 5
= 22

3.思路与方法:

对于此题我们可以想到用的方式来解决。

  • 通过遍历数组;
  • 当数组遍历到的字符为数字时,此时将数字压入栈中;
  • 当遇到运算符号时候,再把栈顶的两个数字拿出来进行计算,计算的结果再压入栈中;
  • 以此类推直至遍历完数组;
  • 最后输出栈中元素即为最后的答案。

同时再注意题目的细节部分,整数除法只保留整数部分。

4.图解力扣:

由上述分析,我们利用图解法结合案例再来直观地分析本题

例如: 输入tokens = ["2","1","+","3","*"]

image.png

i=0时, 此时遍历到的数组字符是数字2,将数字2压入栈中。

image.png

i=1时, 此时遍历到的数组字符是数字1,将数字1压入栈中。

image.png

i=2时, 此时遍历到的数组字符是运算符号/,此时将栈顶的两个元素取出进行整除操作。

2/1=2

将栈顶两个元素的计算结果2压入栈中

image.png

i=3时, 此时遍历到的数组字符是数字3,将数字3压入栈中。

image.png

i=4时 此时遍历到的数组字符是运算符号*,此时将栈顶的两个元素取出进行乘法操作。

2*3=6

将栈顶两个元素的计算结果6压入栈中.

数组遍历完毕,最后输出栈中元素即为结果

5.具体实现代码如下:

package main

import (
   "fmt"
   "strconv"
)

func evalRPN(tokens [5]string) int {
   stack := []int{}

   for _, token := range tokens {
      if num, err := strconv.Atoi(token); err == nil {
         stack = append(stack, num)
      } else {
         n2 := stack[len(stack)-1]
         n1 := stack[len(stack)-2]
         stack = stack[0 : len(stack)-2]

         switch token {
         case "+":
            stack = append(stack, n1+n2)
         case "-":
            stack = append(stack, n1-n2)
         case "*":
            stack = append(stack, n1*n2)
         case "/":
            stack = append(stack, n1/n2)
         }
      }
   }
   return stack[0]
}

func main(){

   var str=[5]string{"2","1","+","3","*"}
   fmt.Printf("逆波兰表达式的结果如下:%v",evalRPN(str))

}

输出为:

image.png

如果你觉得这篇内容对你有帮助的话:

1、点赞支持下吧,让更多的人也能看到这篇内容

2、关注公众号:看那个码农,我们一起学习一起进步。