資料結構之佇列

2021-09-30 18:57:12 字數 2581 閱讀 9219

佇列是只允許在一端進行插入操作,而在另一端進行刪除操作的線性表。佇列是一種先進先出(first in fitst out)的線性表,簡稱fifo。允許插入的一端稱為隊尾,允許刪除的一端稱為對頭。佇列的先進先出的結構正好符合日常生活中人們的生活習慣,即排在第一位的優先出棧,最後來的人自然排在佇列最後了。

由於佇列是特殊的線性表,所以也可以採用陣列來順序儲存。假設乙個佇列有n個元素,則順序儲存的佇列需要建立乙個大於n的陣列,並把佇列的所有元素儲存在陣列的前n個單元,陣列下標為0的一端即是對頭,所謂的入隊操作,其實就是在隊尾追加乙個元素,不需要移動任何元素,時間複雜度是o(1)。而出隊時,是從下標為0的位置出隊。那就意外著當執行出隊操作時佇列中的所有元素都得向前移動,以保證佇列的對頭仍然是下標為0的位置,此時時間複雜度是o(n)。其實,如果不去限制佇列的元素必須儲存在陣列的前n個單元這一條件,出隊的效能就會大大增加。這樣的話,當執行出隊操作時,不必所有的元素都向前移動,而只是讓對頭向後移動一位,指向新的隊頭。

為了避免當只有乙個元素時,對頭和隊尾重合使得處理變得麻煩,所以引入兩個指標,front指標指向對頭元素,rear指標指向隊尾元素的下乙個位置,這樣當front等於rear時,此佇列不是還剩乙個元素,而是空佇列。可是這樣做的話仍然有缺陷,假設長度為5的陣列,初始狀態時,front與rear指標均指向下標為0的位置,當執行多次入隊操作後,rear指向了下標為4的位置,front指向著下標為0的位置。然後執行某次出隊操作後,rear的位置不變,front指向了下標為2的位置。此時如果再執行入隊操作時,rear會指向到下標為5的位置,也就是說rear移動到了陣列之外。還有,如果這個佇列的末尾位置已經被占用,此時如果再入隊的話,就會產生陣列越界的錯誤,可實際上,由於此佇列執行過出隊操作,其下標為0和下標為1的位置仍然空閒,此現象稱為「假溢位」。

解決假溢位的最好方法就是當陣列末尾被占用之後,就再從頭開始,也就是頭尾相接的迴圈。我們把佇列的這種頭尾相接的順序儲存結構稱為迴圈佇列。以剛才的例子來說,當rear指向下標為4的位置時,再執行入隊操作後,rear指向了下標為0的位置,元素成功插入到下標為4的位置。此時又有問題出現,當某次入隊之後rear已經指向了front的位置,即rear和front重合了,此時就很難判斷此佇列是滿隊還是空隊。解決方法是可以設定乙個標識變數來判斷,還有就是改變隊滿的條件,即保留乙個元素空間。也就是說,當佇列滿時,陣列中還會有乙個空閒單元。這種判斷隊滿的方法就是至今在使用的。此時隊滿的條件就是:(rear+1)%maxsize==front(maxsize為陣列容量,%是為了整合rear與front的問題),通用的計算佇列長度的公式為:(rear-front+maxsize)%maxsize。

採用迴圈佇列來儲存佇列的一般操作有:入隊、出隊等。

1.入隊。向佇列中插入元素。

bool enterqueue(sqqueue* s, elemtype e)

else

}

2.出隊。刪除隊中元素。

bool deletequeue(sqqueue* s, elemtype* e)

*e = s->data[s->front]; //將隊頭元素賦值給e

s->front = (s->front + 1) % maxsize; //front指標向後移一位,若到最後則轉到陣列頭部

return true;

}

3.求佇列長度。

//求佇列長度

int queuelength(sqqueue* s)

4.判空。

//判空

void queueempty(sqqueue* s)

else

else

}}

5.列印。

void showqueue(sqqueue* s)

puts("\b;");

}

測試函式和宣告:

//宣告

typedef int elemtype; //佇列容量

#define maxsize 10

typedef struct

sqqueue;

//主函式

int main()

, 0, 0 };

queueempty(&s);

enterqueue(&s, 0);

enterqueue(&s, 1);

enterqueue(&s, 2);

enterqueue(&s, 3);

enterqueue(&s, 4);

enterqueue(&s, 5);

enterqueue(&s, 6);

queueempty(&s);

showqueue(&s);

printf("%d\n", queuelength(&s));

enterqueue(&s, 7);

enterqueue(&s, 8);

queueempty(&s);

showqueue(&s);

printf("%d\n", queuelength(&s));

return 0;

}

以上即是與佇列的順序儲存相關的~~

資料結構之佇列

八 佇列 鏈式佇列 鍊錶實現 隊尾 rear 隊首 front 靜態佇列 陣列實現 必須是迴圈佇列 需要幾個引數來確定,各引數含義 1 佇列初始化 front和rear值都是0 2 佇列非空 front代表佇列第乙個元素 rear代表佇列最後乙個元素的 下乙個元素 3 佇列空 front和rear相...

資料結構之佇列

與棧相反,佇列是一種先進先出的線性表,它只允許在表的一端進行,而在另一端刪除元 素。在佇列中,允許插入的一端叫做隊尾,允許刪除的一端則稱為隊頭。1 鏈佇列 佇列的鏈式表示和實現 用鍊錶表示的佇列簡稱為鏈佇列,乙個鏈佇列顯然需要兩個分別指示對頭和隊尾的指標 分別稱為頭指 針和尾指標 才能唯一確定。這裡...

資料結構之佇列

一 佇列的介紹 佇列 queue 是一種線性儲存結構。它有以下幾個特點 1 佇列中資料是按照 先進先出 fifo,first in first out 方式進出佇列的。2 佇列只允許在 隊首 進行刪除操作,而在 隊尾 進行插入操作。佇列通常包括的兩種操作 入佇列 和 出佇列。1.佇列的示意圖 佇列中...