數據結構 學習筆記 隊列

隊列

基礎概念:限定只能在一端插入、另一端刪除的線性表。

一些定義:

允許刪除的一端叫做隊首(front)

允許插入的一端叫做隊尾(rear)

插入稱作入隊,刪除稱爲出隊

隊列是先進先出(FIFO)

 

儲存方式:

方式一、順序存儲(數組+雙指針)

討論1:1.爲什麼使用雙指針而非直接將data[0]設置爲隊頭,僅使用一個隊尾指針rear?

答:如果僅使用一個隊尾指針,的確可以簡化入隊運算,不需移動元素,只需將元素插入隊尾即可。但出隊操作時,每次都要刪除data[0]的元素,即移動後續元素,同時還需修改rear指針。

討論2:關於front和rear指針,有多種處理方法,一種是front指向頭元素的前一個元素,而非指在頭元素上。rear指向隊尾。而另一種處理方法則是front指向頭元素,rear指向隊尾後一個元素,爲什麼要這樣處理?

答:對於普通順序隊列用處不大,但對於循環隊列而言可以省去很多麻煩,後續採用第一種處理方式。

 

普通順序隊列存在的問題:

可能會由於不斷的入隊和出隊導致“假溢出”,即rear指針已經到達隊尾而front由於不斷出隊導致不斷後移,致使數組元素其實未滿但由於rear到達MAXLEN-1後提示隊滿。

 

循環隊列

即data[0]緊挨着data[MAXLEN-1]首尾相接成環

即當rear == MAXLEN - 1之後,rear再次++後讓rear = 0,這樣即形成了一個邏輯上的閉環(而非物理上的)。data數組中由於這樣的操作,可能會出現front > rear的情況。

而如何進行這樣的運算呢?

方法一、手工判斷

rear = (rear + 1 == MAXLEN) ? 0 : rear++;

方法二、取模

rear = (rear + 1) % MAXLEN

 

出隊也是同樣的

front = (front + 1) % MAXLEN

但是緊接着的問題是如何判斷隊滿或者隊空?

不能僅以front == rear 判斷,因爲這樣無法具體判斷是隊空還是隊滿。

解決該問題有如下兩種方案:

方案一、

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章