隊列,Queue類及一個隊列類的實現
隊列是這樣一種數據結構,數據由列表的尾部進入,並由列表的頭部被移除。隊列用於按項的出現順序來存儲它們。隊列是先進先出(FIFO)數據結構的一個代表。隊列常用於提交給操作系統的命令的處理或提交給一個打印池任務的處理,另外模擬程序使用隊列模型模擬排隊等候的顧客。
隊列操作
與隊列相關的兩個主要操作是向隊列中添加一個項目與由隊列中移除一個項目。向隊列中添加項的操作被稱作入隊(Enqueue),由隊列移除一個項的操作被稱作出隊(Dequeue)。入隊操作向隊列的尾部添加一個項,出隊操作由隊列的頭部移除一個項。圖5.2展示了這些操作。
另一個在隊列上執行的主要操作是查看頭部的項目。Peek方法,類似Stack類中的同名方法,用於查看起始位置的項目。這個方法僅返回這個項目而不是將其由隊列中移除。
Queue類中有許多其它屬性可以用來輔助我們的編程。然而,在我們討論它們之前,讓我們看一下怎樣實現一個隊列類。
實現一個隊列
使用ArrayList來實現一個隊列類幾乎是不用多想的,正如我們棧類的實現。由於其內置的特性,ArrayList是實現這些類型數據結構的一個極佳選擇。當我們需要向隊列插入一個項,ArrayList的Add方法將元素放置在列表中下一個空閒位置。當我們需要由隊列中移除開始位置的項時,ArrayList將列表中剩余項目依次向前移動一個位置。我們不需要維護一個占位標志,其可能導致代碼中出現隱蔽的錯誤。
下面這個隊列類的實現包含了EnQueue,DeQueue,ClearQueue(清空隊列),Peek方法與Count屬性以及一個默認的構造函數:
public class CQueue
{
private ArrayList pqueue;
public CQueue()
{
pqueue = new ArrayList();
}
public void EnQueue(object item)
{
pqueue.Add(item);
}
public void DeQueue()
{
pqueue.RemoveAt(0);
}
public object Peek()
{
return pqueue[0];
}
public void ClearQueue()
{
pqueue.Clear();
}
public int Count()
{
return pqueue.Count;
}
}
Queue類:一個示例程序
之前我們已經介紹了Queue類中的主要方法,並在實現一個自己的隊列類的過程中學習了它們。我們在使用隊列作為基礎數據結構的一個特殊的編程問題中進一步探尋這些方法。首先,我們需要提幾個Queue對象的基本屬性。
當一個新的Queue對象被初始化,這個隊列的默認容量為32。通過定義,當隊列被填滿,其大小將以2倍方式增長。這意味著當一個隊列初始容量被填滿,其容量將變為64.而且這個數字沒有限制。當你初始化一個隊列時,你可以指定一個不同的初始容量。如下所示:
Queue myQueue = new Queue(100);
這個語句將隊列的容量設置為100。你也可以更改增長的倍數,其作為第二個參數傳入構造函數,如下:
Queue myQueue = new Queue(32, 3);
這行語句在默認初始容量的基礎上指定了一個3倍的增長速度。即使這種情況下需要的容量與默認初始容量相同你也需要手工指定,因為此時類構造器尋找一個與默認構造函數是不同簽名的函數。
一個泛型的隊列的初始化方式如下:
Queue<int> numbers = new Queue<int>();
正如之前提到的,隊列常用來模擬人們排隊的情況。一種場景是我們可以用隊列模擬位於Elks Lodge的年度單身午夜舞會。男士女士各排成一隊進入聚會地。舞台非常小同一時間僅可以供3對男女。由於舞台空間所限,當有空存在時,由男女各自的隊列中請出第一個組成一對舞伴。當這一對被由隊列中取出後,排在後一位男士與女士移動到隊列的最前列。
當這個動作發生時,程序將顯示這一對舞伴已經接下來隊列中最前面的人。如果沒有一對完整的舞伴,隊列中下一個人將被宣布。如果隊列中沒有剩余的人,將宣布這種情況。
首先,讓我們看一下我們用來模擬的數據:
F Jennifer Ingram M Frank Opitz M Terrill Beckerman M Mike Dahly F Beata Lovelace M Raymond Williams F Shirley Yaw M Don Gundolf F Bernica Tackett M David Durr M Mike McMillan F Nikki Feldman
我們使用一個數據結構來表示每一個舞者,兩個簡單的String類的方法(Chars與Substring)被用構建一個舞者。如下是程序:
using System;
using System.Collections;
using System.IO;
namespace csqueue
{
public struct Dancer
{
public string name;
public