Go语言程序查找栈中的最小值


在 Go 语言中,我们可以使用迭代方法和优化的迭代方法来查找栈中的最小值。栈是一种线性数据结构,遵循后进先出 (LIFO) 原则。

语法

func (s *Stack) getMin() int {…}

getMin() 函数用于查找栈中的最小值。它以指向栈的地址指针作为参数。

算法

  • 步骤 1 − 首先,我们需要导入 fmt 包。

  • 步骤 2 − 创建一个栈结构,其中包含一个 item 切片来存储栈元素,以及一个 min 切片来存储栈中的最小值。

  • 步骤 3 − 现在,定义函数 push() 和 pop() 来执行栈的基本操作。

  • 步骤 4 − push() 将 item 添加到栈的末尾,并检查 item 是否小于或等于 min 切片中当前的最小值。如果是,则 item 也将添加到 min 切片中。

  • 步骤 5 − pop() 从栈中删除最后一个 item,并检查 item 是否等于 min 切片中的最后一个 item。如果是,则表示 min 切片中的最后一个 item 是栈中的最小值,我们需要将其从 min 切片中删除。

  • 步骤 6 − 现在,创建 getMin() 函数来查找栈中的最小值。它只需返回 min 切片中的最后一个 item,该 item 表示栈中的最小值。

  • 步骤 7 − 启动 main() 函数。在 main() 函数内部,创建一个栈结构并使用一些 item 初始化一个栈。

  • 步骤 8 − 现在,调用 getMin() 函数。

  • 步骤 9 − 此外,栈中的最小值将打印到控制台。

示例 1

在本例中,我们将定义一个 getMin() 函数,该函数用于使用迭代方法查找栈中的最小值。

package main

import "fmt"

type Stack struct {
   items []int
   min   []int
}

func (s *Stack) push(item int) {
   s.items = append(s.items, item)
   if len(s.min) == 0 || item <= s.min[len(s.min)-1] {
      s.min = append(s.min, item)
   }
}

func (s *Stack) pop() int {
   if len(s.items) == 0 {
      return -1 // stack is empty
   }

   popped := s.items[len(s.items)-1]
   s.items = s.items[:len(s.items)-1]

   if popped == s.min[len(s.min)-1] {
      s.min = s.min[:len(s.min)-1]
   }

   return popped
}

func (s *Stack) getMin() int {
   if len(s.min) == 0 {
      return -1
   }

   return s.min[len(s.min)-1]
}

func main() {
   s := Stack{}
   s.push(5)
   s.push(2)
   s.push(7)
   s.push(1)
   s.push(8)
   fmt.Println("Minimum value in stack is:", s.getMin()) 
   s.pop()
   s.pop()
   fmt.Println("Minimum value in stack is:", s.getMin()) 
} 

输出

Minimum value in stack is: 1
Minimum value in stack is: 2 

示例 2

在本例中,我们将定义一个 getMin() 函数,该函数用于以优化的方式使用迭代方法查找栈中的最小值。

package main

import (
   "errors"
   "fmt"
)

type Stack struct {
   items []int
}

func (s *Stack) Push(item int) {
   s.items = append(s.items, item)
}

func (s *Stack) Pop() (int, error) {
   if len(s.items) == 0 {
      return 0, errors.New("stack is empty")
   }
   poppedItem := s.items[len(s.items)-1]
   s.items = s.items[:len(s.items)-1]
   return poppedItem, nil
}

func (s *Stack) Min() (int, error) {
   if len(s.items) == 0 {
      return 0, errors.New("stack is empty")
   }
   minItem := s.items[0]
   for _, item := range s.items {
      if item < minItem {
         minItem = item
      }
   }
   return minItem, nil
}

func main() {
   stack := Stack{}
   stack.Push(4)
   stack.Push(6)
   stack.Push(2)
   stack.Push(8)
   stack.Push(1)

   minItem, err := stack.Min()
   if err != nil {
      fmt.Println(err)
   } else {
      fmt.Println("Minimum value in stack is:", minItem)
   }
}

输出

Minimum value in stack is: 1

结论

我们已成功编译并执行了一个 Go 语言程序,该程序使用迭代方法和优化的迭代方法来查找栈中的最小值。在第一个示例中,我们使用了迭代方法,在第二个示例中,我们使用了优化的迭代方法。

更新于: 2023年5月10日

235 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告