package main import "errors" // 逻辑结构: 只允许在表的一端进行插入, 另一端进行删除的线性表 // 由于线性队列会出现上溢出, 因此讨论循环队列 var ErrQueueFull = errors.New("队满错误") var ErrQueueEmpty = errors.New("队空错误") type Queue struct { data []interface{} Front, Rear int maxSize int } // 初始化 func (q *Queue) InitQueue(maxSize int) { q.maxSize = maxSize q.data = make([]interface{}, maxSize) q.Front = 0 q.Rear = 0 } // 判空 func (q Queue) isNull() bool { if q.Front != q.Rear { return false } return true } // 判满(如果队尾指针追上队首指针, 则认为队满) func (q Queue) isFull() bool { if (q.Rear + 1) % q.maxSize == q.Front{ return true } return false } // 入队 func (q *Queue) EnQueue(Element interface{}) error { if q.isFull(){ return ErrQueueFull } q.data[q.Rear] = Element q.Rear = (q.Rear + 1) * q.maxSize return nil } // 出队 func (q *Queue) DeQueue()(interface{}, error) { if q.isNull(){ return nil, ErrQueueEmpty } e := q.data[q.Front] q.Front = (q.Front + 1) % q.maxSize return e, nil }