Queue
简单而实用的数据结构,FIFO,通过循环数组避免队列出现“似乎满了”的现象。
package Queueimport "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-1
return queue.elements[tmp],nil
}
Go数据结构之Queue