structure_old/priority_queue/priority_queue.go

90 lines
1.5 KiB
Go
Raw Normal View History

2019-01-31 10:39:17 +00:00
package plist
import (
"github.com/emirpasic/gods/utils"
)
// PriorityQueue 优先队列 适合数据量不大, 加索引
type PriorityQueue struct {
2019-02-13 18:42:14 +00:00
data *Tree
2019-02-13 08:47:11 +00:00
2019-02-13 18:42:14 +00:00
Head *AvlNode
Tail *AvlNode
2019-02-08 22:32:58 +00:00
comparator utils.Comparator
}
2019-01-31 10:39:17 +00:00
// NewWithInt compare use int
func NewWithInt() *PriorityQueue {
p := new(PriorityQueue)
2019-02-13 10:02:01 +00:00
2019-01-31 10:39:17 +00:00
p.comparator = func(a, b interface{}) int {
if a.(int) > b.(int) {
return 1
}
return -1
}
2019-02-13 10:02:01 +00:00
2019-02-13 18:42:14 +00:00
p.data = NewWith(p.comparator)
2019-02-13 10:02:01 +00:00
2019-01-31 10:39:17 +00:00
return p
}
2019-02-08 22:32:58 +00:00
func (pq *PriorityQueue) String() string {
2019-02-13 18:42:14 +00:00
return pq.data.String()
}
func (pq *PriorityQueue) Top() (interface{}, bool) {
return pq.Head, pq.Head != nil
}
2019-01-31 19:57:40 +00:00
2019-02-13 18:42:14 +00:00
func (pq *PriorityQueue) Bottom() (interface{}, bool) {
return pq.Tail, pq.Tail != nil
}
func (pq *PriorityQueue) Get(index int) (interface{}, bool) {
var cur *AvlNode
if index >= 0 {
cur := pq.Head
for index > 0 && cur != nil {
index--
cur = cur.Prev()
}
} else {
cur := pq.Tail
for index < -1 && cur != nil {
index++
cur = cur.Next()
2019-02-10 17:27:47 +00:00
}
2019-01-31 19:57:40 +00:00
}
2019-02-13 18:42:14 +00:00
return cur, cur != nil
2019-02-13 08:47:11 +00:00
}
2019-02-13 18:42:14 +00:00
func (pq *PriorityQueue) Push(v interface{}) {
pnode := pq.data.Put(v)
if pq.Head == nil {
pq.Head = pnode
pq.Tail = pnode
return
}
if pq.comparator(v, pq.Head.Value) > 0 {
pq.Head = pnode
return
}
if pq.comparator(v, pq.Tail.Value) < 0 {
pq.Tail = pnode
return
}
}
func (pq *PriorityQueue) Remove(index int) interface{} {
return nil
}
func (pq *PriorityQueue) Values(index int) []interface{} {
return pq.data.Values()
}