本文实例讲述了C#数据结构之队列(Quene)。,具体如下:
队列(Quene)的特征就是“先进先出”,队列把所有操作限制在"只能在线性结构的两端"进行,更具体一点:添加元素必须在线性表尾部进行,而删除元素只能在线性表头部进行。
先抽象接口IQuene<T>
namespace 栈与队列
{
public interface IQuene<T>
{
/// <summary>
/// 取得队列实际元素的个数
/// </summary>
/// <returns></returns>
public int Count();
/// <summary>
/// 判断队列是否为空
/// </summary>
/// <returns></returns>
public bool IsEmpty();
/// <summary>
/// 清空队列
/// </summary>
public void Clear();
/// <summary>
/// 入队(即向队列尾部添加一个元素)
/// </summary>
/// <param name="item"></param>
public void Enquene(T item);
/// <summary>
/// 出队(即从队列头部删除一个元素)
/// </summary>
/// <returns></returns>
public T Dequene();
/// <summary>
/// 取得队列头部第一元素
/// </summary>
/// <returns></returns>
public T Peek();
}
}
下面是基于数组实现的示意图:
实现思路:用一个数组存放所有元素,同时设置二个关键变量front与rear用于记录队列“头”与“尾”的元素下标,当有元素入列时rear加1,当有元素出队时front+1,而rear-front即为队列实际元素的总数.
但有一种“队列伪满”的特殊情况要注意,如下图:
这张图上面的部分:假设经过入队、出队一番折腾后,rear已经指向数组的下标最大值,而front指向在中间(即front之间的元素已经出队不用考虑了,相当于front下标前面的内存区域空闲),如果这时再有一个元素入列,rear+1就超出数组下标的最大值了,但是从图上一眼就能看出,实际上front前面还空着一堆位置可以重复利用,队列并非真正的“满”--这种情况称为伪满,为了解决这个问题,我们可以把数组想象为首尾相接的循环结构,即图中下面部分,这时候可以让rear重新指向到0,以便重复利用空闲的位置。












