65 lines
1.2 KiB
Go
65 lines
1.2 KiB
Go
package dijkstra
|
|
|
|
import "sync"
|
|
|
|
type NodeQueue struct {
|
|
Items []Vertex
|
|
lock sync.RWMutex
|
|
}
|
|
|
|
// Enqueue adds an Node to the end of the queue
|
|
func (s *NodeQueue) Enqueue(t Vertex) {
|
|
s.lock.Lock()
|
|
defer s.lock.Unlock()
|
|
|
|
if len(s.Items) == 0 {
|
|
s.Items = append(s.Items, t)
|
|
return
|
|
}
|
|
var insertFlag bool
|
|
for k, v := range s.Items {
|
|
// add vertex distance less than travers's vertex distance
|
|
if t.Distance < v.Distance {
|
|
s.Items = append(s.Items[:k+1], s.Items[k:]...)
|
|
s.Items[k] = t
|
|
insertFlag = true
|
|
}
|
|
if insertFlag {
|
|
break
|
|
}
|
|
}
|
|
if !insertFlag {
|
|
s.Items = append(s.Items, t)
|
|
}
|
|
}
|
|
|
|
// Dequeue removes an Node from the start of the queue
|
|
func (s *NodeQueue) Dequeue() *Vertex {
|
|
s.lock.Lock()
|
|
defer s.lock.Unlock()
|
|
item := s.Items[0]
|
|
s.Items = s.Items[1:len(s.Items)]
|
|
return &item
|
|
}
|
|
|
|
//NewQ Creates New Queue
|
|
func (s *NodeQueue) NewQ() *NodeQueue {
|
|
s.lock.Lock()
|
|
defer s.lock.Unlock()
|
|
s.Items = []Vertex{}
|
|
return s
|
|
}
|
|
|
|
// IsEmpty returns true if the queue is empty
|
|
func (s *NodeQueue) IsEmpty() bool {
|
|
s.lock.RLock()
|
|
defer s.lock.RUnlock()
|
|
return len(s.Items) == 0
|
|
}
|
|
|
|
// Size returns the number of Nodes in the queue
|
|
func (s *NodeQueue) Size() int {
|
|
s.lock.RLock()
|
|
defer s.lock.RUnlock()
|
|
return len(s.Items)
|
|
} |