一、环形队列
环形队列图
思路:
1,front变量,初始值为 0,指向队列的第一个元素也是待取出的数据,
也就是说arr[front]是队列的第一个元素
2,rear变量,rear 初始值为 0,指向待添加数据的位置,队列添加数据时,因逻辑上的闭环,指针可能再次回到前面的位置,不能单一递增处理,会出现角标越界异常,需通过取模来重新计算指针的值
3,当队列满时 条件是 (rear + 1) % maxsize == front 假如,maxsize 为10,front为0,rear为9 此时队列就满了
4,当队列为空时,条件是 rear == front
5,rear指针指向待添加数据的元素位置,假设队列内部数组的最大容量为maxsize ,当rear指针指向maxsize -1时,实际该位置上并无数据,因此,队列的最大容量只有maxsize -1,即队列的最大有效数据个数为maxsize -1,因为预留一个位置
概念摘自:
原文链接:https://blog.csdn.net/qq_36296417/article/details/106730607
代码:
package main
import (
"errors"
"fmt"
"os"
)
//使用一个结构体管理环形队列
type CircleQueue struct {
maxSize int//4
array [5]int//数组
head int//指向队列队头
tail int//指向队尾 `
}
//入队列
func (this *CircleQueue) Push(val int) (err error) {
if this.IsFull(){
return errors.New("queue full")
}
//分析出this.tail 在队列尾部,但是不包含最后的元素
this.array[this.tail]=val//把值给尾部
this.tail=(this.tail+1)%this.maxSize
return
}
//出队列
func (this *CircleQueue) Pop() (val int,err error) {
if this.IsEmpty(){
return 0,errors.New("queue empty")
}
//取出,head指向队首,并且含队首元素
val=this.array[this.head]
this.head=(this.head+1)%this.maxSize
return
}
//判断环形队列是否满
func (this *CircleQueue) IsFull() bool {
return (this.tail&