檢查優先佇列是否為空的Go語言程式


優先佇列是一種佇列,其中元素與其優先順序值一起儲存。優先佇列支援的函式包括:入隊和出隊,其中入隊表示將元素及其優先順序新增到佇列中,出隊表示從佇列中刪除元素及其優先順序。在本文中,我們將編寫一個Go語言程式來檢查優先佇列是否為空。

語法

func make ([] type, size, capacity)

Go語言中的`make`函式用於建立陣列/對映,它接受要建立的變數型別、大小和容量作為引數。

func append(slice, element_1, element_2…, element_N) []T

`append`函式用於向陣列切片中新增值。它接受多個引數。第一個引數是要向其新增值的陣列,後跟要新增的值。然後,該函式返回包含所有值的最終陣列切片。

func len(v Type) int

`len()`函式用於獲取任何引數的長度。它接受一個引數作為要查詢其長度的資料型別變數,並返回一個整數,表示該變數的長度。

演算法

  • 步驟1 - 建立一個Item結構體,其中包含三個欄位:值為字串型別,優先順序為int型別,索引為int型別。

  • 步驟2 - 然後,建立一個PriorityQueue型別作為`*Item`指標的切片,併為PriorityQueue型別建立Len、Less、Swap、Push和Pop方法。

  • 步驟3 - 然後,為PriorityQueue型別實現IsEmpty方法,以檢查優先佇列的長度是否為零。

  • 步驟4 - 在main函式中,使用`make`內建函式建立一個空的PriorityQueue並將其賦值為pq。然後,使用IsEmpty方法檢查pq是否為空,並在控制檯上列印輸出。

  • 步驟5 - 建立一個值為“chocolate”,優先順序為2的項並將其推入pq。在此步驟中,建立另一個值為“milk-shake”,優先順序為1的項並將其推入pq。

  • 步驟6 - 檢查pq是否為空,並在控制檯上列印輸出。然後,使用`heap.Pop`從pq中刪除一個項。

  • 步驟7 - 最後,檢查pq是否為空,並列印輸出。

示例1

在這個例子中,我們將編寫一個Go語言程式,使用`container/heap`包的內部方法來檢查優先佇列是否為空。

package main

import (
   "container/heap"
   "fmt"
)
type Item struct {
   value    string 
   priority int    
   index    int    
}
type PriorityQueue []*Item

func (pq PriorityQueue) Len() int { return len(pq) }

func (pq PriorityQueue) Less(i, j int) bool {
   return pq[i].priority < pq[j].priority
}
func (pq PriorityQueue) Swap(i, j int) {
   pq[i], pq[j] = pq[j], pq[i]
   pq[i].index = i
   pq[j].index = j
}
func (pq *PriorityQueue) Push(x interface{}) {
   n := len(*pq)
   item := x.(*Item)
   item.index = n
   *pq = append(*pq, item)
}
func (pq *PriorityQueue) Pop() interface{} {
   old := *pq
   n := len(old)
   item := old[n-1]
   item.index = -1 
   *pq = old[0 : n-1]
   return item
}
func (pq *PriorityQueue) IsEmpty() bool {
   return len(*pq) == 0
}
func main() {
   pq := make(PriorityQueue, 0)

   heap.Init(&pq)

   fmt.Println("Is priority queue empty?", pq.IsEmpty())

   item1 := &Item{
      value:    "chocolate",
      priority: 2,
   }
   heap.Push(&pq, item1)

   fmt.Println("Is priority queue empty?", pq.IsEmpty())

   item2 := &Item{
      value:    "milk shake",
      priority: 1,
   }
   heap.Push(&pq, item2)

   fmt.Println("Is priority queue empty?", pq.IsEmpty())

   _ = heap.Pop(&pq)

   fmt.Println("Is priority queue empty?", pq.IsEmpty())

   _ = heap.Pop(&pq)

   fmt.Println("Is priority queue empty?", pq.IsEmpty())
}

輸出

Is priority queue empty? true
Is priority queue empty? false
Is priority queue empty? false
Is priority queue empty? false
Is priority queue empty? true

結論

在本文中,我們討論瞭如何檢查我們的語言中優先佇列是否為空。我們已經執行了此操作的程式,該程式使用了`container/heap`包。空的優先佇列看起來可能沒用,但它是大型演算法的構建塊,提供了靈活性,並且可以以多種其他方式使用。

更新於:2023年7月5日

瀏覽量:138

啟動你的職業生涯

完成課程獲得認證

開始學習
廣告