定義:隊列是一種特殊的線性表,特殊之處在於它只允許在表的前端(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;
}
}