資料結構與演算法 006 順序佇列

2021-09-25 05:43:16 字數 2740 閱讀 7776

一、佇列的概念:

佇列(簡稱作隊,queue)也是一種特殊的線性表,佇列的資料元素以及資料元素間的邏輯關係和線性表完全相同,其差別是線性表允許在任意位置插入和刪除,而佇列只允許在其一端進行插入操作在其另一端進行刪除操作。

佇列中允許進行插入操作的一端稱為隊尾,允許進行刪除操作的一端稱為隊頭。佇列的插入操作通常稱作入佇列,佇列的刪除操作通常稱作出佇列。

下圖是乙個依次向佇列中插入資料元素a0,a1,…,an-1後的示意圖:

上圖中,a0是當前 隊頭資料元素,an-1是當前 隊尾資料元素。

為了避免當只有乙個元素時,對頭和隊尾重合使得處理變得麻煩,所以引入兩個指標:front指標指向隊頭元素,rear指標指向隊尾元素的下乙個位置,這樣的話,當front指標等於rear時,此佇列不是還剩乙個元素,而是空佇列。

二、佇列的抽象資料型別:

資料集合:

佇列的資料集合可以表示為a0,a1,…,an-1,每個資料元素的資料型別可以是任意的型別。

操作集合:

(2)出佇列delete():把隊頭資料元素刪除並由函式返回。

(3)取隊頭資料元素getfront():取隊頭資料元素並由函式返回。

(4)非空否isempty():非空否。若佇列非空,則函式返回false,否則函式返回true。

三、迴圈順序佇列:

線性表有順序儲存和鏈式儲存,佇列是一種特殊的線性表,同樣也存在這兩種儲存方式。我們先來看一下佇列的順序儲存。

1、順序佇列的「假溢位」:

上圖中,front指標指向隊頭元素,rear指標指向隊尾元素的下乙個位置。圖(d)中b、c、d出隊後,front指標指向元素e,rear指標在陣列外面。假設這個佇列的總個數不超過5個,但目前如果接著入隊的話,因陣列末尾元素已經被占用,再向後加就會產生陣列越界的錯誤,可實際上佇列在下標為0、1、2、3、4的地方還是空閒的,我們把這種現象叫做「假溢位」。

2、迴圈順序佇列:

所以解決假溢位的辦法就是後面滿了,就再從頭開始,也就是頭尾相接的迴圈。我們把佇列的這種邏輯上首尾相連的順序儲存結構稱為迴圈佇列。

如何判斷迴圈佇列究竟是空的還是滿的:

現在問題又來了,我們之前說,空佇列時,front指標等於rear指標,那麼現在迴圈佇列滿的時候,也是front等於rear,那麼如何判斷迴圈佇列究竟是空的還是滿的?有如下辦法:

辦法1:設定乙個標誌位flag。初始時置flag=0;每當入佇列操作成功就置flag=1;每當出佇列操作成功就置flag=0。則佇列空的判斷條件為:rear == front && tag==0;佇列滿的判斷條件為:rear = = front && tag= =1。

辦法2:保留乙個元素的儲存空間。此時,佇列滿時的判斷條件為 (rear + 1) % maxsize == front;佇列空的判斷條件還是front == rear。

辦法3:設計乙個計數器count,統計佇列中的元素個數。此時,佇列滿的判斷條件為:count > 0 && rear == front ;佇列空的判斷條件為count == 0。

下面是具體**的實現

實現佇列方法的介面:iqueue.cs

using system;

using system.collections.generic;

using system.text;

namespace 佇列

int getlength();

bool isempty();

void clear();

void enqueue(t item);

t dequeue();

t peek();}}

實現順序佇列方法的類:seqqueue.cs

using system;

using system.collections.generic;

using system.text;

namespace 佇列

public seqqueue() : this(10)

public int count

}public void clear()

//出隊

public t dequeue()

else

}//入隊

public void enqueue(t item)

else//當有空間可存的時候

else}}

public int getlength()

public bool isempty()

public t peek()}}

測試:program.cs

using system;

using system.collections;

using system.collections.generic;

namespace 佇列}}

執行結果:

資料結構與演算法 順序佇列

queue.h ifndef queul h define queue h includeusing namespace std templateclass queue templatequeue queue int queuecapacity capacity queuecapacity temp...

資料結構與演算法之順序佇列

本程式能夠對使用者的輸入做了合理的處理使得使用者想要刪除超過本佇列的最大容量時會提醒使用者該操作錯誤,從而讓使用者重新輸入,更人性化的提供了兩種刪除佇列元素的方法供使用者選擇 完成對佇列的初始化 判斷佇列的空和滿 插入元素 獲取佇列的首元素 刪除元素 銷毀佇列 返回佇列的長度 列印佇列 includ...

資料結構順序佇列

佇列是一種特殊的 線性表,特殊之處在於它只允許在表的前端 front 進行刪除操作,而在表的後端 rear 進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。順序佇列 ifndef sqqueue h define sqqueue h incl...