Golang 检查优先队列是否为空

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

结论

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

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程