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 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.