added priority queue
This commit is contained in:
parent
681ab9cecb
commit
340ce63653
77
priorityqueue.go
Normal file
77
priorityqueue.go
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
package containers
|
||||||
|
|
||||||
|
import "sync"
|
||||||
|
|
||||||
|
type element[T any] struct {
|
||||||
|
priority int
|
||||||
|
value T
|
||||||
|
}
|
||||||
|
|
||||||
|
type PriorityQueue[T any] struct {
|
||||||
|
lock sync.RWMutex
|
||||||
|
items []*element[T]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q *PriorityQueue[T]) Add(priority int, value T) {
|
||||||
|
q.lock.Lock()
|
||||||
|
defer q.lock.Unlock()
|
||||||
|
|
||||||
|
item := &element[T]{
|
||||||
|
priority: priority,
|
||||||
|
value: value,
|
||||||
|
}
|
||||||
|
|
||||||
|
inserted := false
|
||||||
|
for k, v := range q.items {
|
||||||
|
if item.priority > v.priority {
|
||||||
|
q.items = append(q.items[:k], append([]*element[T]{item}, q.items[k+1:]...)...)
|
||||||
|
inserted = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !inserted {
|
||||||
|
q.items = append(q.items, item)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q *PriorityQueue[T]) Pop() (T, bool) {
|
||||||
|
q.lock.Lock()
|
||||||
|
defer q.lock.Unlock()
|
||||||
|
|
||||||
|
if len(q.items) == 0 {
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
|
||||||
|
item := q.items[0]
|
||||||
|
q.items = q.items[1:]
|
||||||
|
|
||||||
|
return item.value, true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q *PriorityQueue[T]) Len() int {
|
||||||
|
q.lock.RLock()
|
||||||
|
defer q.lock.RUnlock()
|
||||||
|
|
||||||
|
return len(q.items)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q *PriorityQueue[T]) Peek() (T, bool) {
|
||||||
|
q.lock.RLock()
|
||||||
|
defer q.lock.RUnlock()
|
||||||
|
|
||||||
|
if len(q.items) == 0 {
|
||||||
|
var def T
|
||||||
|
return def, false
|
||||||
|
}
|
||||||
|
|
||||||
|
return q.items[0].value, true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q *PriorityQueue[T]) Clear() {
|
||||||
|
q.lock.Lock()
|
||||||
|
defer q.lock.Unlock()
|
||||||
|
|
||||||
|
q.items = []*element[T]{}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user