这次介绍的是循环队列,介绍循环队列之前,先介绍一下队列的概念。队列(Queue):入队(添加数据)操作限定在队尾(Rear),其他操作限定在队头(Front)的线性表,当队列中没有数据元素时称为空队列。
队列也有两种:顺序队列和链队列,他们区别是,顺序队列是用数组来储存数据的,但是链队列是用单个变量和引用来保存数据的,但是他们的处理数据的逻辑都是一样的,入队(添加数据)操作限定在队尾(Rear),其他操作限定在队头(Front)
今天要说的是顺序队列的一种形式叫循环顺序队列
先画个图来说明顺序队列
队列添加元素的时候是从队尾添加,rear值指向的是队尾数据的索引,而队首的front值指向的是队首数据的索引-1,当队列为空时rear=front=-1,rear是随着数据的增加而增加,而front是随着数据减少而增加,因为队列出队操作被限定在了队首。当rear的等于数组的长度-1时,就会出现两种情况,一、数组已经满了,需要扩容,二、数组有过删除数据的操作,没有满,但是因为队列操作的逻辑,删除数据是从队首开始的。所以就会出现下图的情况
第一种情况,没有删除数据的操作,数组是满的,正常扩容
第二种情况,有过删除数据的操作,数组不是满的
这里你会发现,由于队首的数据被删除,所以数组并没有满,所以我们需要继续从0开始填充数据,正是由于这种情况,所以有了循环顺序队列,
循环顺序队列
循环顺序队列就是在程序逻辑上把数组的队首和队尾连在一起,这样最大化利用队列的空间,
介绍完毕,上代码
一、定义接口
/// <summary>
/// 队列的接口 队列的实现有 顺序队列和链队列
/// </summary>
/// <typeparam name="T"></typeparam>
interface IQueue<T>
{
int Count { get; }
int GetLength();
bool IsEmpty();
void Clear();
void Enqueue(T item);//入队
T Dequeue();//出队,删除队首数据
T Peek();//返回队首数据,不删除
}