Golang 程序检查优先级队列是否为空
优先级队列是将元素及其优先级值一起存储的队列。优先级队列支持的功能包括 - enqueue 和 dequeue,其中 enqueue 表示将元素及其优先级添加到队列中,而 dequeue 表示从队列中删除元素及其优先级。在本文中,我们将编写一个 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 类型的索引
步骤 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("优先队列是否为空?", pq.IsEmpty()) item1 := &Item{ value: "chocolate", priority: 2, } heap.Push(&pq, item1) fmt.Println("优先队列是否为空?", pq.IsEmpty()) item2 := &Item{ value: "milk shake", priority: 1, } heap.Push(&pq, item2) fmt.Println("优先队列是否为空?", pq.IsEmpty()) _ = heap.Pop(&pq) fmt.Println("优先队列是否为空?", pq.IsEmpty()) _ = heap.Pop(&pq) fmt.Println("优先队列是否为空?", pq.IsEmpty()) }
输出
优先队列是否为空? true 优先队列是否为空? false 优先队列是否为空? false 优先队列是否为空? false 优先队列是否为空? true
结论
在本文中,我们讨论了如何用我们的语言检查优先级队列是否为空。我们已经使用容器/堆包执行了此操作的程序。空优先级队列可能看起来没用,但它可以作为大型算法的构建块,提供灵活性,并且可以以多种其他方式使用。