golang使用数组模拟环形队列(demo)
//定义环形队列结构体
typeLoopQueue struct{
MaxSize int
array [5]int
front int
rear int
over bool //标识队列是否溢出
}
//定义环形队列的添加数据方法
func(loop*LoopQueue) Add(val int) {
//环形队列如果队列满了会覆盖前面先进来的位置元素
ifloop.rear == loop.MaxSize -1 {
//重置队尾的指针指向,从头重新开始队列的逻辑
//这里如果用取模的话,还没实现
loop.rear = -1
//这个是为了退出条件,当loop.rear == loop.front
loop.front = loop.rear + 1
//队列是否溢出覆盖
loop.over = true
}
loop.rear++
//如果溢出了则会覆盖队列前面先进来的数据,
//但是这些数据是后面进来的,要遵循FIFO原则,
//则队列首部指针往后面移动
ifloop.over {
loop.front++
}
loop.array[loop.rear] = val
}
//定义环形队列的数据查看方法
func(loop*LoopQueue) Show()(err error) {
fori := loop.front + 1;i < loop.rear;i++ {
fmt.Println("show:",loop.array[i])
}
returnerr
}
//定义取出环形队列的数据方法
func(loop*LoopQueue) Get()(val int,err error) {
//这里判断队列为空要分两种情况
// 1.正常队列情况,数据没有溢出覆盖,即队列首部在前,队列尾部在后,此时loop.front < loop.rear
// 2.队列溢出了.数据把以前队列前面的数据覆盖了,此时loop.front > loop.rear
ifloop.front == loop.rear {
return-1,errors.New("queue is empty111")
}
//这个表示队列前面有些数据已经溢出被覆盖了
ifloop.rear < loop.front {
ifloop.front == loop.MaxSize -1{
val = loop.array[loop.front]
//当front读取队列后边尾部时,此时由于队列是溢出的,队列前面还有
//此时则重置front为初始值,从头在开始逻辑
loop.front = -1
returnval,err
}
val = loop.array[loop.front]
loop.front++
returnval,err
}
ifloop.front < loop.rear {
ifloop.rear == loop.front {
return-1,errors.New("queue is empty~")
}
loop.front++
val = loop.array[loop.front]
returnval,err
}
return
}
文章名称:golang使用数组模拟环形队列(demo)
本文来源:http://ybzwz.com/article/pdpcpj.html