-
Notifications
You must be signed in to change notification settings - Fork 2
/
queue.go
88 lines (83 loc) · 1.3 KB
/
queue.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package anthill
func (q *antQueue) Enqueue(num, path, pos int) {
ant := &antStruct{
Num: num,
Path: path,
Pos: pos,
}
if q.Back == nil {
q.Front = ant
q.Back = ant
return
}
q.Back.Next = ant
q.Back = ant
}
func (q *antQueue) Dequeue() *antStruct {
if q.Front == nil {
return nil
}
res := q.Front
if q.Front == q.Back {
q.Front = nil
q.Back = nil
} else {
q.Front = q.Front.Next
}
return res
}
func (q *antQueue) EnqueueAnt(ant *antStruct) {
ant.Next = nil
if q.Back == nil {
q.Front = ant
q.Back = ant
return
}
q.Back.Next = ant
q.Back = ant
}
func (q *sortedQueue) Enqueue(r *room, weight int, mark bool) {
node := &weightNode{
Room: r,
Weight: weight,
Mark: mark,
}
if q.Front == nil {
q.Front = node
q.Back = node
return
}
if q.Front.Weight > weight {
node.Next = q.Front
q.Front = node
return
} else if q.Back.Weight <= weight {
q.Back.Next = node
q.Back = node
return
}
prev := q.Front
cur := prev.Next
for cur != nil {
if cur.Weight > weight {
prev.Next = node
node.Next = cur
return
}
prev = cur
cur = cur.Next
}
}
func (q *sortedQueue) Dequeue() *weightNode {
if q.Front == nil {
return nil
}
res := q.Front
if q.Front == q.Back {
q.Front = nil
q.Back = nil
} else {
q.Front = q.Front.Next
}
return res
}