gitee.com/lh-her-team/common@v1.5.1/queue/queue.go (about) 1 package queue 2 3 import ( 4 "fmt" 5 "log" 6 "sync" 7 ) 8 9 type Element interface{} 10 11 type Queue interface { 12 PushFront(e Element) // 向队头添加元素 13 PushBack(e Element) // 向队尾添加元素 14 PeekFront() Element // 查看头部的元素 15 PeekBack() Element // 查看尾部的元素 16 PollFront() Element // 移除头部的元素 17 PollBack() Element // 移除尾部的元素 18 Remove(e Element) bool // 删除一个值 19 Exist(e Element) bool // 是否存在 20 Size() int // 获取队列的元素个数 21 IsEmpty() bool // 判断队列是否是空 22 Clear() bool // 清空队列 23 NewIterator() *Iterator 24 } 25 26 type node struct { 27 value Element // 当前节点的值 28 prev *node // 前一个节点 29 next *node // 下一个节点 30 } 31 32 type LinkedQueue struct { 33 m sync.Mutex 34 head *node // 头节点 35 tail *node // 尾节点 36 size int // 大小 37 } 38 39 func NewLinkedQueue() *LinkedQueue { 40 return &LinkedQueue{ 41 size: 0, 42 } 43 } 44 45 func (queue *LinkedQueue) PushFront(e Element) { 46 queue.m.Lock() 47 defer queue.m.Unlock() 48 newNode := &node{e, nil, queue.head} 49 if queue.head == nil { 50 queue.head = newNode 51 queue.tail = newNode 52 } else { 53 queue.head.prev = newNode 54 queue.head = newNode 55 } 56 queue.size++ 57 newNode = nil // nolint: ineffassign 58 } 59 60 func (queue *LinkedQueue) PushBack(e Element) { 61 queue.m.Lock() 62 defer queue.m.Unlock() 63 newNode := &node{e, queue.tail, nil} 64 if queue.tail == nil { 65 queue.head = newNode 66 queue.tail = newNode 67 } else { 68 queue.tail.next = newNode 69 queue.tail = newNode 70 } 71 queue.size++ 72 newNode = nil // nolint: ineffassign 73 } 74 75 func (queue *LinkedQueue) PeekFront() Element { 76 if queue.head == nil { 77 return nil 78 } 79 return queue.head.value 80 } 81 82 func (queue *LinkedQueue) PeekBack() Element { 83 if queue.tail == nil { 84 return nil 85 } 86 return queue.tail.value 87 } 88 89 // 移除队列中最前面的元素 90 func (queue *LinkedQueue) PollFront() Element { 91 queue.m.Lock() 92 defer queue.m.Unlock() 93 if queue.IsEmpty() { 94 return nil 95 } 96 if queue.head == nil { 97 fmt.Println("Poll Empty queue.") 98 return nil 99 } 100 queue.size-- 101 firstNode := queue.head 102 queue.head = firstNode.next 103 if queue.head != nil { 104 queue.head.prev = nil 105 } else { 106 queue.tail = nil 107 } 108 return firstNode.value 109 } 110 111 func (queue *LinkedQueue) PollBack() Element { 112 queue.m.Lock() 113 defer queue.m.Unlock() 114 if queue.IsEmpty() { 115 return nil 116 } 117 if queue.tail == nil { 118 fmt.Println("PollBottom Empty queue.") 119 return nil 120 } 121 queue.size-- 122 latestNode := queue.tail 123 queue.tail = latestNode.prev 124 if queue.tail != nil { 125 queue.tail.prev = nil 126 queue.tail.next = nil 127 } else { 128 queue.head = nil 129 } 130 return latestNode.value 131 } 132 133 func (queue *LinkedQueue) Remove(e Element) bool { 134 queue.m.Lock() 135 defer queue.m.Unlock() 136 if queue.IsEmpty() { 137 return true 138 } 139 if queue.head == nil { 140 return true 141 } 142 firstNode := queue.head 143 queue.del(firstNode, e) 144 return true 145 } 146 147 func (queue *LinkedQueue) del(cNode *node, e Element) *node { 148 if queue.IsEmpty() { 149 return nil 150 } 151 if cNode == nil { 152 return nil 153 } 154 nNode := *cNode 155 prev := cNode.prev 156 next2 := cNode.next 157 if cNode.value == e { 158 // 查找元素 159 if prev == nil && next2 == nil { 160 queue.head = nil 161 queue.tail = nil 162 } 163 if prev != nil { 164 prev.next = next2 165 } 166 if next2 != nil { 167 next2.prev = prev 168 } 169 cNode.value = nil 170 queue.size-- 171 return &nNode 172 } 173 return queue.del(next2, e) 174 } 175 176 func (queue *LinkedQueue) Exist(e Element) bool { 177 queue.m.Lock() 178 defer queue.m.Unlock() 179 if queue.IsEmpty() { 180 return false 181 } 182 if queue.head == nil { 183 return false 184 } 185 firstNode := queue.head 186 return queue.exist(firstNode, e) 187 } 188 189 func (queue *LinkedQueue) exist(cNode *node, e Element) bool { 190 defer func() { 191 if err := recover(); err != nil { 192 log.Println("LinkedQueue exist", "err", err) 193 } 194 }() 195 if queue.IsEmpty() { 196 return false 197 } 198 next2 := cNode.next 199 if cNode.value == e { 200 // 查找元素 201 return true 202 } 203 return queue.exist(next2, e) 204 } 205 206 func (queue *LinkedQueue) Size() int { 207 return queue.size 208 } 209 210 func (queue *LinkedQueue) IsEmpty() bool { 211 return queue.size == 0 212 } 213 214 func (queue *LinkedQueue) Clear() bool { 215 if queue.IsEmpty() { 216 return false 217 } 218 queue.m.Lock() 219 defer queue.m.Unlock() 220 queue.remove() 221 return true 222 } 223 224 func (queue *LinkedQueue) remove() { 225 if !queue.IsEmpty() { 226 firstNode := queue.head 227 if firstNode != nil { 228 queue.head = firstNode.next 229 firstNode.next = nil 230 firstNode.value = nil 231 } 232 queue.size-- 233 queue.remove() 234 } 235 } 236 237 // NewIterator creates a new iterator for the cache. 238 func (queue *LinkedQueue) NewIterator() *Iterator { 239 return &Iterator{ 240 current: queue.head, 241 } 242 }