隊列
基礎概念:限定只能在一端插入、另一端刪除的線性表。
一些定義:
允許刪除的一端叫做隊首(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 判斷,因爲這樣無法具體判斷是隊空還是隊滿。
解決該問題有如下兩種方案:
方案一、