package main
import (
"errors"
"fmt"
)
//实现一个头部删除,尾部插入的循坏队列。循坏队列不需要数组的反复移动,效率比较高
const QueueSize = 4
//空一个空格表示满格
type CricleQueue struct {
data[QueueSize]interface{}
front int
rear int
}
func initQueue(q *CricleQueue){
q.front=0
q.rear=0
}
func Queuelength(q *CricleQueue)int{ //队列长度
return (q.rear-q.front+QueueSize)%QueueSize
}
func EnQueue(q *CricleQueue,data interface{})(err error){
if (q.rear+1)%QueueSize == q.front%QueueSize{
return errors.New("队列已经满")
}
q.data[q.rear]=data //入队
q.rear=(q.rear+1)%QueueSize //循环 到101回到1
return nil
}
func DeQueue(q *CricleQueue)(data interface{},err error){
if q.front == q.rear{
return nil,errors.New("队列为空")
}
res := q.data[q.front] //取出数据
q.data[q.front]=0 // 清空数据
q.front=(q.front+1)%QueueSize //小于100加一,101回到1的位置
return res,nil
}
func main(){
var myq CricleQueue
initQueue(&myq)
EnQueue(&myq,1)
EnQueue(&myq,2)
EnQueue(&myq,3)
EnQueue(&myq,4)
EnQueue(&myq,5)
fmt.Println(DeQueue(&myq))
fmt.Println(DeQueue(&myq))
fmt.Println(DeQueue(&myq))
fmt.Println(DeQueue(&myq))
fmt.Println(DeQueue(&myq))
}
输出结果
结果
网友评论