Golang 检查优先队列是否为空
优先队列是一种将元素与其优先级值一起存储的队列。优先队列支持的函数有 – 入队和出队,其中入队表示将元素及其优先级添加到队列中,出队表示将元素及其优先级从队列中移除。在本文中,我们将编写一个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结构体,其中包含一个类型为字符串的值字段,一个类型为整数的优先级字段和一个类型为整数的索引字段。
-
步骤2 - 然后,创建PriorityQueue类型作为*Item指针的切片,并为PriorityQueue类型创建Len、Less、Swap、Push和Pop方法。
-
步骤3 - 然后,为PriorityQueue类型实现IsEmpty方法,以检查优先级队列的长度是否为零。
-
步骤4 - 在主函数中,使用内置函数make创建一个空的PriorityQueue,并将其赋值给pq。然后,使用IsEmpty方法检查pq是否为空,并将输出打印到控制台。
-
步骤5 - 创建一个值为”chocolate”和优先级为2的项,并将其推入pq。在此步骤中,创建并推入下一个值为”milk-shake”和优先级为1的项到pq。
-
步骤6 - 检查pq是否为空,并将输出打印到控制台。然后,使用heap.Pop从pq中移除一个项。
-
步骤7 - 最后,检查pq是否为空,并将输出打印出来。
示例1
在这个示例中,我们将编写一个Go语言程序,使用容器/堆包的内部方法来检查优先级队列是否为空。
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
结论
在本文中,我们讨论了如何检查我们的语言中的优先级队列是否为空。我们执行了使用容器/堆包的程序来进行此操作。空的优先级队列可能看起来没有用,但它是大型算法的构建模块,提供了灵活性,并可以以各种其他方式使用。