1、实现环形队列的思路分析及要点
注:head表示队列首部,tail表示队列尾部,maxSize表示队列容量
(1)尾部索引下一个为头部索引时,表示队列满,需要将数组空出一个作为
约定(即一个容量为4的队列,需要容量为5的数组),公式表示为(tail+1)%maxSize = head.
(2)队里为空 tail = head
(3)初始化时,tail = 0 ,head = 0
(4)需要计算出队列有多少元素(tail + maxSize - head)% maxSize
2、实现一个容量为4的队列,代码如下:
package main
import (
"errors"
"fmt"
"os"
)
type CircleQueue struct {
maxSize int
array [5]int //数组
head int // 指向队列队首0
tail int // 指向队尾 0
}
//判断队列是否已满
func (this *CircleQueue) IsFull() bool {
return (this.tail+1)%this.maxSize == this.head
}
//判断队里是否为空
func (this *CircleQueue) IsEmpty() bool {
return this.tail == this.head
}
//进队列
func (this *CircleQueue) AddQueue(val int) (err error) {
if this.IsFull() {
return errors.New("队列已满")
}
//把值给尾部
this.array[this.tail] = val
this.tail = (this.tail + 1) % this.maxSize
return
}
//出队列
func (this *CircleQueue) GetQueue() (val int, err error) {
if this.IsEmpty() {
return 0, errors.New("队列已空")
}
val = this.array[this.head]
this.head = (this.head + 1) % this.maxSize
return
}
//显示队列元素
func (this *CircleQueue) ListQueue() {
fmt.Println("队列情况如下:")
//计算出队列多少元素
//比较关键的一步
size := (this.tail + this.maxSize - this.head) % this.maxSize
if size == 0 {
fmt.Println("队列已空")
}
//定义一个辅助变量 指向head
tempHead := this.head
for i := 0; i < size; i++ {
fmt.Printf("arr[%d]=%d\t", tempHead, this.array[tempHead])
tempHead = (tempHead + 1) % this.maxSize
}
fmt.Println()
}
//主函数
func main() {
//初始化一个队列
queue := &CircleQueue{
maxSize: 5,
head: 0,
tail: 0,
}
var key string
var val int
for {
fmt.Println("1. 输入add 表示添加数据到队列")
fmt.Println("2. 输入get 表示从队列获取数据")
fmt.Println("3. 输入show 表示显示队列")
fmt.Println("4. 输入exit 表示显示队列")
fmt.Print("请输入:")
fmt.Scanln(&key)
switch key {
case "add":
fmt.Println("输入你要入队列数")
fmt.Scanln(&val)
err := queue.AddQueue(val)
if err != nil {
fmt.Println(err.Error())
} else {
fmt.Println("加入队列ok")
}
case "get":
val, err := queue.GetQueue()
if err != nil {
fmt.Println(err.Error())
} else {
fmt.Println("从队列中取出了一个数=", val)
}
case "show":
queue.ListQueue()
case "exit":
os.Exit(0)
}
}
}
3、结果
(1)将数字10 、20 、30 、 40 、加入队列后(队列已满),不能继续加入
(2)取出一个后,可继续加入新元素
(3)队列元素的索引编号进行0-4之间的循环