【算法笔记】PriorityQueue的简单实践
Page content
今天用go语言简单的写了一下PriorityQueue的方法。
为了以后方便查看,当做笔记整理了一下~~
1.优先队列(PriorityQueue)
维基百科里是这么解释的。
优先队列是计算机科学中的一类抽象数据类型。优先队列中的每个元素都有各自的优先级,优先级最高的元素最先得到服务;
优先级相同的元素按照其在优先队列中的顺序得到服务。优先队列往往用堆来实现。
下面用go语言简单的实现了PriorityQueue。
struct
type PriorityQueue struct {
Head *Node
}
type Node struct {
Value string
Priority int
Next *Node
}
Push
func (p *PriorityQueue) Push(value string, priority int) {
if p.Head == nil {
p.Head = &Node{Value: value, Priority: priority}
return
}
newNode := &Node{Value: value, Priority: priority}
currentNode := p.Head
for currentNode.Next != nil && currentNode.Next.Priority > priority {
currentNode = currentNode.Next
}
newNode.Next = currentNode.Next
currentNode.Next = newNode
}
Pop
func (p *PriorityQueue) Pop() *Node {
if p.Head == nil {
return nil
}
result := p.Head
p.Head = p.Head.Next
return result
}
Peek,IsEmpty,Print
func (p *PriorityQueue) Peek() *Node {
return p.Head
}
func (p *PriorityQueue) IsEmpty() bool {
return p.Head == nil
}
func (n *Node) Print() {
if n == nil {
return
}
fmt.Print(n.Value, " ")
n.Next.Print()
}
执行结果
func main() {
priorityQueue := PriorityQueue{}
priorityQueue.Push("a", 100)
priorityQueue.Push("b", 83)
priorityQueue.Push("c", 64)
priorityQueue.Push("e", 37)
priorityQueue.Push("f", 23)
fmt.Println("-------- Print --------")
priorityQueue.Head.Print()
fmt.Println("")
fmt.Println("-------- Pop --------")
fmt.Printf("%+v", priorityQueue.Pop())
fmt.Println("")
priorityQueue.Head.Print()
fmt.Println("")
fmt.Println("-------- Push z --------")
priorityQueue.Push("z", 53)
priorityQueue.Head.Print()
fmt.Println("")
fmt.Println("-------- Peek() --------")
fmt.Printf("%+v", priorityQueue.Peek())
}
执行结果为:
$ go run main.go
-------- Print --------
a b c e f
-------- Pop --------
&{Value:a Priority:100 Next:0xc0000a43c0}
b c e f
-------- Push z --------
b c z e f
-------- Peek() --------
&{Value:b Priority:83 Next:0xc0000a43e0}
欢迎大家的意见和交流
email: li_mingxie@163.com