队列
目录
队列的实现
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())
}
}