首页 > 代码库 > Go数据结构之Queue

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-1
    return queue.elements[tmp],nil
}