前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >golang刷leetcode 字符串(4)逆波兰式

golang刷leetcode 字符串(4)逆波兰式

作者头像
golangLeetcode
发布2022-08-02 17:14:45
2410
发布2022-08-02 17:14:45
举报
文章被收录于专栏:golang算法架构leetcode技术php

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

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

说明:

整数除法只保留整数部分。

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

示例 1:

代码语言:javascript
复制
输入: ["2", "1", "+", "3", "*"]
输出: 9
解释: ((2 + 1) * 3) = 9

示例 2:

代码语言:javascript
复制
输入: ["4", "13", "5", "/", "+"]
输出: 6
解释: (4 + (13 / 5)) = 6

示例 3:

代码语言:javascript
复制
输入: ["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

解题思路:

本题很简单,理解逆波兰式就ok

逆波兰式求解原理:

1,从左往右扫描token

2,如果式操作数,入栈

3,如果是操作符,弹出两个操作数

4,计算结果,将结果入栈

5,扫描完token,栈中,剩下结果,结果出栈

代码语言:javascript
复制
import "strconv"

func evalRPN(tokens []string) int {
  var s stack
  for i := 0; i < len(tokens); i++ {
    if !isOperator(tokens[i]) {
      s.Push(tokens[i])
    } else {
      op2 := s.Pop()
      op1 := s.Pop()
      res := eval(op1, op2, tokens[i])
      s.Push(fmt.Sprint(res))
    }
  }
  r := s.Pop()
  rv, _ := strconv.ParseInt(r, 10, 64)
  return int(rv)

}

func eval(op1 string, op2 string, token string) int64 {
  o1, _ := strconv.ParseInt(op1, 10, 64)
  o2, _ := strconv.ParseInt(op2, 10, 64)
  switch token {
  case "+":
    return o1 + o2
  case "-":
    return o1 - o2
  case "*":
    return o1 * o2
  case "/":
    return o1 / o2
  }
  return 0
}

func isOperator(token string) bool {
  return token == "+" || token == "-" || token == "*" || token == "/"
}

type stack struct {
  data []string
}

func (s *stack) Push(str string) {
  s.data = append(s.data, str)
}

func (s *stack) Pop() string {
  if len(s.data) < 1 {
    return ""
  }
  str := s.data[len(s.data)-1]
  s.data = s.data[:len(s.data)-1]
  return str
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 golang算法架构leetcode技术php 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档