github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/algorithm/datastructures/queue/array_queue.go (about) 1 package queue 2 3 import ( 4 "fmt" 5 "strings" 6 ) 7 8 // 数组队列 9 type ArrayQueue struct { 10 data []interface{} 11 head int 12 tail int 13 capacity int 14 } 15 16 func NewArrayQueue(cap int) *ArrayQueue { 17 return &ArrayQueue{ 18 data: make([]interface{}, cap, cap), 19 head: 0, 20 tail: 0, 21 capacity: cap, 22 } 23 } 24 25 func (q *ArrayQueue) Dequeue() interface{} { 26 if q.IsEmpty() { 27 return nil 28 } 29 ret := q.data[q.head] 30 q.data[q.head] = nil 31 q.head++ 32 return ret 33 } 34 35 func (q *ArrayQueue) Enqueue(v interface{}) bool { 36 len := q.Len() 37 if len >= q.capacity { //满了 38 return false 39 } 40 if q.tail >= q.capacity { // 进行搬迁 41 for i := 0; i < len; i++ { 42 q.data[i] = q.data[i+q.head] 43 q.data[i+q.head] = nil 44 } 45 q.head = 0 46 q.tail = len 47 } 48 q.data[q.tail] = v 49 q.tail++ 50 return true 51 } 52 53 func (q *ArrayQueue) IsEmpty() bool { 54 return q.tail == q.head 55 } 56 57 func (q *ArrayQueue) Len() int { 58 return q.tail - q.head 59 } 60 61 func (q *ArrayQueue) String() string { 62 var sb strings.Builder 63 sb.WriteString("head ") 64 for i := q.head; i < q.tail; i++ { 65 sb.WriteString(fmt.Sprintf("%v ", q.data[i])) 66 } 67 sb.WriteString("tail") 68 return sb.String() 69 }