定义:队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。
今天我们将将顺序队列和循环队列(附代码实现)
顺序队列
首先我们要有一块连续的存储空间去存储我们队列的元素,这里我们使用数组。当然还需要两个指针,一个(front)指向队头,一个(rear)指向队尾元素。
所谓顺序队列就是在队尾加入一个元素rear+1,从队头删除一个元素front+1。当rear增加到指向分配的连续空间之外时,队列无法再插入新元素,但这时往往还有大量可用空间未被占用,这些空间是已经出队的队列元素曾经占用过得存储单元,这是顺序队列的一个最大的缺点,浪费内存。
循环队列
解决顺序队列的缺点的办法就是,当rear增加到指向分配的连续空间之外时,将rear指向数组的第一个位置。
这实际上是把队列空间想象成一个环形空间,环形空间中的存储单元循环使用,用这种方法管理的队列也就称为循环队列。除了一些简单应用之外,真正实用的队列是循环队列。
下面是循环队列的C#代码实现:
/// <summary>
/// 循环队列
/// </summary>
public class Queue
{
//private int[] arr; //队列容器
//private int maxSize; //容器初始化长度
//private int front; //队头元素下标
//private int rear; //队尾元素下标
//private int length; //队列长度
public int[] Arr { get; set; }
public int MaxSize { get; set; }
public int Front { get; set; }
public int Rear { get; set; }
public int Length { get; set; }
public Queue(int maxSize)
{
this.Arr = new int[maxSize];
this.MaxSize = maxSize;
this.Front = 0;
this.Rear = -1;
this.Length = 0;
}
/// <summary>
/// 向队列中插入一个元素
/// </summary>
/// <param name="elem">加入的元素的值</param>
public void insert(int elem)
{
if (isFull())
{
Console.WriteLine("队列已满,不能再插入元素");
return;
}
if (Rear == MaxSize-1)
{
Rear = -1;
}
Arr[++Rear] = elem;
Length++;
}
/// <summary>
/// 从对垒中移除对头元素
/// </summary>
/// <returns>返回移除的元素</returns>
public int? remove()
{
if (isEmpty())
{
Console.WriteLine("队列为空,没有可以删除的元素");
return null;
}
int elem = Arr[Front++];
if (Front == MaxSize)
{
Front = 0;
}
Length--;
return elem;
}
/// <summary>
/// 查看队头元素
/// </summary>
/// <returns></returns>
public int? peek()
{
if (isEmpty())
{
Console.WriteLine("队列为空,没有元素");
return null;
}
return Arr[Front];
}
/// <summary>
/// 判断队列是否为空
/// </summary>
/// <returns></returns>
public bool isEmpty()
{
return (Length == 0);
}
/// <summary>
/// 判断队列是否已满
/// </summary>
/// <returns></returns>
public bool isFull()
{
if (Length == MaxSize)
{
return true;
}
return false;
}
}