Golang 程序检查优先级队列是否为空

go programmingserver side programmingprogramming更新于 2025/5/15 19:22:17

优先级队列是将元素及其优先级值一起存储的队列。优先级队列支持的功能包括 - 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

结论

在本文中,我们讨论了如何用我们的语言检查优先级队列是否为空。我们已经使用容器/堆包执行了此操作的程序。空优先级队列可能看起来没用,但它可以作为大型算法的构建块,提供灵活性,并且可以以多种其他方式使用。


相关文章