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  }