C#数据结构之队列(Quene)实例详解

2019-12-30 11:22:08丽君
易采站长站为您分析C#数据结构之队列(Quene),结合实例形式较为详细的讲述了队列的功能、原理与C#实现队列的相关技巧,需要的朋友可以参考下  

本文实例讲述了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();
  }
}

下面是基于数组实现的示意图:

C#数据结构之队列(Quene)实例详解

实现思路:用一个数组存放所有元素,同时设置二个关键变量front与rear用于记录队列“头”与“尾”的元素下标,当有元素入列时rear加1,当有元素出队时front+1,而rear-front即为队列实际元素的总数.

但有一种“队列伪满”的特殊情况要注意,如下图:

C#数据结构之队列(Quene)实例详解

这张图上面的部分:假设经过入队、出队一番折腾后,rear已经指向数组的下标最大值,而front指向在中间(即front之间的元素已经出队不用考虑了,相当于front下标前面的内存区域空闲),如果这时再有一个元素入列,rear+1就超出数组下标的最大值了,但是从图上一眼就能看出,实际上front前面还空着一堆位置可以重复利用,队列并非真正的“满”--这种情况称为伪满,为了解决这个问题,我们可以把数组想象为首尾相接的循环结构,即图中下面部分,这时候可以让rear重新指向到0,以便重复利用空闲的位置。