队列
          目录
          
        
        
      队列的实现
package queue
import "fmt"
// ArrayQueue 定义一个结构体
type ArrayQueue struct {
	// 表示数组最大容量
	maxSize int
	// 表示数组定位
	front int
	// 表示队列尾
	rear int
	// 切片
	array []int
}
// NewArrayQueue 写一个工厂模式创建结构体
func NewArrayQueue(maxSize int) *ArrayQueue {
	return &ArrayQueue{
		maxSize: maxSize,
		front:   -1,
		rear:    -1,
		array:   make([]int, maxSize),
	}
}
// IsFull 判断队列是否已经满了
func (arrayQueue *ArrayQueue) IsFull() bool {
	return arrayQueue.rear == arrayQueue.maxSize-1
}
// IsEmpty 判断队列是否为空
func (arrayQueue *ArrayQueue) IsEmpty() bool {
	return arrayQueue.front == arrayQueue.rear
}
// Enqueue 从队列中添加一个数据
func (arrayQueue *ArrayQueue) Enqueue(data int) bool {
	if arrayQueue.IsFull() {
		return false
	}
	arrayQueue.rear++
	arrayQueue.array[arrayQueue.rear] = data
	return true
}
// Dequeue 从队列中删除一个数据
func (arrayQueue *ArrayQueue) Dequeue() (int, bool) {
	if arrayQueue.IsEmpty() {
		return 0, false
	}
	arrayQueue.front++
	data := arrayQueue.array[arrayQueue.front]
	return data, true
}
// GetSize 获取队列的大小
func (arrayQueue *ArrayQueue) GetSize() int {
	return arrayQueue.rear - arrayQueue.front + 1
}
// Print 打印队列数据
func (arrayQueue *ArrayQueue) Print() {
	for i := arrayQueue.front + 1; i <= arrayQueue.rear; i++ {
		fmt.Println(arrayQueue.array[i])
	}
}package main
import (
	"fmt"
	"my-practice/3.queue/arrayqueue/queue"
)
// 使用数组实现队列
func main() {
	queue := queue.NewArrayQueue(3)
	queue.Enqueue(1)
	queue.Enqueue(2)
	queue.Enqueue(3)
	queue.Enqueue(4)
	dequeue, _ := queue.Dequeue()
	fmt.Println(dequeue)
	queue.Print()
	queue.Enqueue(5)
	queue.Print()
}环形队列
package queue
import "fmt"
type RingQueue struct {
	data []interface{}
	size int
	head int
	next int
}
func NewRingQueue(size int) *RingQueue {
	return &RingQueue{
		data: make([]interface{}, size),
		size: size,
		head: 0,
		next: 0,
	}
}
func (q *RingQueue) IsFull() bool {
	return (q.next+1)%q.size == q.head
}
func (q *RingQueue) IsEmpty() bool {
	return q.head == q.next
}
func (q *RingQueue) Push(v interface{}) {
	if q.IsFull() {
		return
	}
	q.data[q.next] = v
	q.next = (q.next + 1) % q.size
}
func (q *RingQueue) Pop() interface{} {
	if q.IsEmpty() {
		return nil
	}
	v := q.data[q.head]
	q.head = (q.head + 1) % q.size
	return v
}
func (q *RingQueue) Len() int {
	return (q.next - q.head + q.size) % q.size
}
func (q *RingQueue) Print() {
	for i := q.head; i < q.head+q.Len(); i++ {
		fmt.Println(q.data[i%q.size])
	}
}写单测
文件名以_test.go结尾
package main
import (
	"fmt"
	"my-practice/3.queue/arrayqueue/queue"
	"testing"
)
func TestArrayQueue(t *testing.T) {
	queue := queue.NewArrayQueue(3)
	queue.Enqueue(1)
	queue.Enqueue(2)
	queue.Enqueue(3)
	queue.Enqueue(4)
	dequeue, _ := queue.Dequeue()
	fmt.Println(dequeue)
	queue.Print()
	queue.Enqueue(5)
	queue.Print()
}
func TestRingQueue(t *testing.T) {
	ringQueue := queue.NewRingQueue(5)
	ringQueue.Push(1)
	ringQueue.Push("2")
	ringQueue.Push(3)
	ringQueue.Push(4)
	ringQueue.Push(5)
	ringQueue.Push(6)
	ringQueue.Print()
	fmt.Println("开始输出。。。。。")
	for i := 0; i < 5; i++ {
		fmt.Println(ringQueue.Pop())
	}
}