优秀的编程知识分享平台

网站首页 > 技术文章 正文

栈:用golang实现逆波兰表示法算法逻辑

nanyue 2024-12-31 13:38:20 技术文章 5 ℃

题目介绍:给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。

请你计算该表达式。返回一个表示表达式值的整数。

注意:

  • 有效的算符为 '+'、'-'、'*' 和 '/' 。
  • 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
  • 两个整数之间的除法总是 向零截断
  • 表达式中不含除零运算。
  • 输入是一个根据逆波兰表示法表示的算术表达式。
  • 答案及所有中间计算结果可以用 32 位 整数表示。

示例 1:

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

示例 2:

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

下面为golang的代码逻辑

package main

import (
    "fmt"
    "strconv"
    "testing"
)

// Helper function to check if a string is a digit
func isDigit(s string) bool {
    _, err := strconv.Atoi(s)
    return err == nil
}

// Function to evaluate Reverse Polish Notation expression
func evaluateRPN(tokens []string) []int {
    stack := []int{}

    for _, token := range tokens {
       if isDigit(token) {
          // If the token is a number, push it onto the stack
          num, _ := strconv.Atoi(token)
          stack = append(stack, num)
       } else {
          // If the token is an operator, pop two numbers from the stack
          num2 := stack[len(stack)-1]
          num1 := stack[len(stack)-2]
          stack = stack[:len(stack)-2]

          // Perform the operation and push the result back onto the stack
          switch token {
          case "+":
             stack = append(stack, num1+num2)
          case "-":
             stack = append(stack, num1-num2)
          case "*":
             stack = append(stack, num1*num2)
          case "/":
             stack = append(stack, num1/num2)
          }
       }
    }

    // The final result is the only number left on the stack
    return stack
}

func TestPL(t *testing.T) {
    // Example expressions
    expression := []string{"2", "1", "+", "3", "*"}
    expression2 := []string{"4", "13", "5", "/", "+"}
    expression3 := []string{"10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"}

    fmt.Println("Result of expression 1:", evaluateRPN(expression))  // Output: 9
    fmt.Println("Result of expression 2:", evaluateRPN(expression2)) // Output: 6
    fmt.Println("Result of expression 3:", evaluateRPN(expression3)) // Output: 22
}

Tags:

最近发表
标签列表