檢查優先佇列是否為空的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`包。空的優先佇列看起來可能沒用,但它是大型演算法的構建塊,提供了靈活性,並且可以以多種其他方式使用。