package plist import ( "github.com/emirpasic/gods/utils" ) // PriorityQueue 优先队列 适合数据量不大, 加索引 type PriorityQueue struct { data *Tree Head *AvlNode Tail *AvlNode comparator utils.Comparator } // NewWithInt compare use int func NewWithInt() *PriorityQueue { p := new(PriorityQueue) p.comparator = func(a, b interface{}) int { if a.(int) > b.(int) { return 1 } return -1 } p.data = NewWith(p.comparator) return p } func (pq *PriorityQueue) String() string { return pq.data.String() } func (pq *PriorityQueue) Top() (interface{}, bool) { return pq.Head, pq.Head != nil } 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() } } return cur, cur != nil } 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() }