// 定义环形队列结构体
type LoopQueue struct {
? MaxSize int
?
array [5]int
?
front int
?
rear int
?
over bool ?// 标识队列是否溢出
}

// 定义环形队列的添加数据方法
func (loop *LoopQueue) Add(val int) {
? // 环形队列如果队列满了会覆盖前面先进来的位置元素
?
if loop.rear == loop.MaxSize -1 ?{
? ? ?// 重置队尾的指针指向,从头重新开始队列的逻辑
? ? ?
// 这里如果用取模的话,还没实现
? ? ?
loop.rear = -1
? ? ?
// 这个是为了退出条件,loop.rear == loop.front
? ? ?
loop.front = loop.rear + 1
? ? ?
// 队列是否溢出覆盖
? ? ?
loop.over = true
?
}
? loop.rear++
? // 如果溢出了则会覆盖队列前面先进来的数据,
? //
但是这些数据是后面进来的,要遵循FIFO原则,
? //
则队列首部指针往后面移动
?
if loop.over {
? ? ?loop.front++
? }
? loop.array[loop.rear] = val
}


// 定义环形队列的数据查看方法
func (loop *LoopQueue) Show()(err error) ?{
? for i := loop.front + 1; i < loop.rear; i++ {
? ? ?fmt.Println("show:", loop.array[i])
? }
? return err
}

// 定义取出环形队列的数据方法
func (loop *LoopQueue) Get()(val int, err error) {
? // 这里判断队列为空要分两种情况
?
// 1.正常队列情况, 数据没有溢出覆盖,即队列首部在前,队列尾部在后,此时loop.front < loop.rear
? // 2.
队列溢出了.数据把以前队列前面的数据覆盖了,此时loop.front > loop.rear
?
if loop.front == loop.rear {
? ? ?return -1, errors.New("queue is empty111")
? }
? // 这个表示队列前面有些数据已经溢出被覆盖了
?
if loop.rear < loop.front {
? ? ?if loop.front == loop.MaxSize -1 {
? ? ? ? val = loop.array[loop.front]
? ? ? ? // front读取队列后边尾部时,此时由于队列是溢出的,队列前面还有
? ? ? ?
// 此时则重置front为初始值,从头在开始逻辑
? ? ? ?
loop.front = -1
? ? ? ?
return val, err
? ? ?}
? ? ?val = loop.array[loop.front]
? ? ?loop.front++
? ? ?return val, err
? }
? if loop.front < loop.rear {
? ? ?if loop.rear == loop.front {
? ? ? ? return -1, errors.New("queue is empty~")
? ? ?}
? ? ?loop.front++
? ? ?val = loop.array[loop.front]
? ? ?return val, err
? }
? return
}