Go数据结构之Queue
Queue
简单而实用的数据结构,FIFO,通过循环数组避免队列出现“似乎满了”的现象。
package Queue import "errors" const ( defaultQueueSize=10 ) var queueSize int type MyQueue struct{ front int rear int currentCount int elements interface {} } /** 指定大小的初始化 */ func NewMyQueueBySize(size int) *MyQueue{ queueSize=size return &MyQueue{0, size-1,0,make([] interface {},size)} } /** 按默认大小进行初始化 */ func NewMyQueue() *MyQueue{ return NewMyQueueBySize(defaultQueueSize) } /** 向下一个位置做探测 */ func ProbeNext(i int) int{ return (i+1)%/queueSize } /** 清空队列 */ func (queue *MyQueue)ClearQueue(){ queue.front=0 queue.rear=queueSize-1 queue.currentCount=0 } /** 是否为空队列 */ func (queue *MyQueue)IsEmpty() bool{ if ProbeNext(queue.rear)==queue.front{ return true } return false } /** 队列是否满了 */ func (queue *MyQueue)IsFull() bool{ if ProbeNext(ProbeNext(queue.rear))==queue.front{ return true } return false } /** 入队 */ func (queue *MyQueue)Offer(e interface {}) error{ if queue.IsFull()==true{ return errors.New("the queue is full.") } queue.rear=ProbeNext(queue.rear) queue.elements[queue.rear]=e queue.currentCount=queueSize+1 return nil } /** 出队一个元素 */ func (queue *MyQueue)Poll()(interface {},error){ if queue.IsEmpty()==true{ return nil,errors.New("the queue is empty.") } tmp:=queue.front queue.front=ProbeNext(queue.front) queue.currentCount=queue.currentCount-1 return queue.elements[tmp],nil }