使用Golang创建优先队列的程序


优先队列是一种队列,其中元素被分配了优先级,优先级较高的元素比优先级较低的元素先弹出。

在本文中,我们将编写Golang程序来创建优先队列。它们可以使用堆、切片、树等实现,并用于执行诸如将元素推入队列和从队列中移除元素等操作。

语法

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的结构体,其中包含三个字段:value(项目的值,类型为字符串)、priority(项目的优先级,类型为整数)和index(项目的索引,类型为整数)。

  • 步骤 2 - 然后,创建一个名为PriorityQueue的类型,作为Item的切片,并带有指向它的指针。

  • 步骤 3 - 实现Len()方法、Less()方法、Swap()方法、Push()方法、Pop()方法。

  • 步骤 4 - 最后,实现update方法来更新队列元素的优先级和值。

  • 步骤 5 - 在main函数中,创建一个名为piq的空优先队列,类型为PriorityQueue。

  • 步骤 6 - 在此步骤中,使用heap包中的Push()函数将项目推入优先队列,并使用PriorityQueue的Update()方法更新项目的优先级。

  • 步骤 7 - 在这里,从heap包中的优先队列中弹出项目,直到队列为空。打印每个弹出项目的value和priority。

示例 1

在本例中,我们将编写一个Golang程序,使用二叉堆创建优先队列。项目的切片将被创建为指向它的指针。

package main

import (
   "container/heap"
   "fmt"
)
type Item struct {
   value    string 
   priority int    
   index    int   
}

type PriorityQueue []*Item
func (piq PriorityQueue) Len() int {
   return len(piq)
}
func (piq PriorityQueue) Less(i, j int) bool {
   
   return piq[i].priority > piq[j].priority
}
func (piq PriorityQueue) Swap(i, j int) {
   piq[i], piq[j] = piq[j], piq[i]
   piq[i].index = i
   piq[j].index = j
}
func (piq *PriorityQueue) Push(x interface{}) {
   n := len(*piq)
   item := x.(*Item)
   item.index = n
   *piq = append(*piq, item)
}
func (piq *PriorityQueue) Pop() interface{} {
   old := *piq
   n := len(old)
   item := old[n-1]
   item.index = -1 
   *piq = old[0 : n-1]
   return item
}
func (piq *PriorityQueue) Update(item *Item, value string, priority int) {
   item.value = value
   item.priority = priority
   heap.Fix(piq, item.index)
}
func main() {
   piq := make(PriorityQueue, 0)
   
   heap.Push(&piq, &Item{value: "Item 1", priority: 30})
   heap.Push(&piq, &Item{value: "Item 2", priority: 10})
   heap.Push(&piq, &Item{value: "Item 3", priority: 20})

   item := piq[2]
   piq.Update(item, item.value, 40)
   
   for piq.Len() > 0 {
      item := heap.Pop(&piq).(*Item)
      fmt.Printf("Value: %s, Priority: %d\n", item.value, item.priority)
   }
}

输出

Value: Item 3, Priority: 40
Value: Item 1, Priority: 30
Value: Item 2, Priority: 10

示例 2

在本例中,我们将编写一个Golang程序,使用Item结构体的切片来实现优先队列。

package main

import (
   "fmt"
)
type Item struct {
   value    string 
   priority int    
}
type PriorityQueue []Item
func (piq PriorityQueue) Len() int {
   return len(piq)
}
func (piq PriorityQueue) Less(i, j int) bool {
   
   return piq[i].priority > piq[j].priority
}
func (piq PriorityQueue) Swap(i, j int) {
   piq[i], piq[j] = piq[j], piq[i]
}
func (piq *PriorityQueue) Push(x interface{}) {
   item := x.(Item)
   *piq = append(*piq, item)
}
func (piq *PriorityQueue) Pop() interface{} {
   old := *piq
   n := len(old)
   item := old[n-1]
   *piq = old[0 : n-1]
   return item
}
func main() {
   piq := make(PriorityQueue, 0)

   
   piq.Push(Item{value: "Item 1", priority: 30})
   piq.Push(Item{value: "Item 2", priority: 10})
   piq.Push(Item{value: "Item 3", priority: 20})
 
   for piq.Len() > 0 {
      item := piq.Pop().(Item)
      fmt.Printf("Value: %s, Priority: %d\n", item.value, item.priority)
   }
}

输出

Value: Item 3, Priority: 20
Value: Item 2, Priority: 10
Value: Item 1, Priority: 3

结论

在本文中,我们编译并执行了创建优先队列的程序,使用了两个示例。在第一个示例中,我们使用堆创建了一个“priorityqueue”,在第二个示例中,我们使用了切片和自定义函数。优先队列可以用于任务调度、霍夫曼编码、迪杰斯特拉算法等等。

更新于: 2023年7月5日

2K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告