Queue
简单而实用的数据结构,FIFO,通过循环数组避免队列出现“似乎满了”的现象。
package Queueimport "errors"const ( defaultQueueSize=10)var queueSize inttype 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}