像棧一樣,佇列也是一種線性表。它允許在表的一端插入資料,在另一端刪除元素。插入元素的這一端稱之為隊尾。刪除元素的這一端我們稱之為隊首。佇列的結構如下圖所示。
佇列的特性:
順序佇列的實現
public
class
arrayqueue
public
boolean
isempty()
public
intsize()
public
void
enqueue(e e)
public e dequeue()
public e head()
@override
public string tostring()
}
迴圈佇列從順序佇列的出隊操作可以看出,當刪除乙個元素時,佇列中的元素都要向前移動乙個位置。為了解決這個問題,這裡介紹下迴圈佇列。
我們可以將佇列看成乙個首位相連的環。當乙個元素從佇列刪除後,新空餘出來的空間可以作為佇列的尾部。如圖下所示。
在編寫**之前,我們先考慮兩個問題。佇列的陣列下標怎麼計算?
如果是在普通的佇列中,那麼插入元素,直接將tail + 1即可。可是在迴圈隊中,元素插入的位置可能是原來隊首的位置,如上圖中的i,這樣如果直接用tail + 1就會造成越界。所以我們計算陣列下標的時候要進行取模。使用( tail + 1 ) % n。同理,刪除元素也是類似。
下標的問題解決了,那麼還有個問題,如何判斷佇列是否為空,佇列是否為滿呢?
從上面的圖可以看出當tail == head的時候,這個是否佇列是即可以為空,又可以為滿。那麼我們不妨將佇列最後乙個元素的空氣預留出來。這樣的話當tail == head的時候,隊列為空。當佇列的tail + 1 == head,我們就認為佇列已經滿了,因為是迴圈佇列,所以計算tail + 1 == head應該算上偏移量即 ( tail + 1 ) % n = head % n。
public
class
loopqueue
public
loopqueue(int capcaity)
public
intsize()
public
boolean
isempty()
public
void
enqueue(e e)
data[tail] = e;
tail = (tail + 1)% data.length;
size++;
}public e dequeue()
e e = data[head];
head = (head + 1)% data.length;
size--;
if(size == data.length / 4 && data.length / 2 != 0)
return e;
}public e head()
private
void
resize(int newcapcaity)
head = 0;
tail = size;
data = newdata;
}@override
public string tostring()
int lastindex = sbuilder.lastindexof(",");
if(lastindex != -1)
return sbuilder.tostring();
}
資料結構之佇列
八 佇列 鏈式佇列 鍊錶實現 隊尾 rear 隊首 front 靜態佇列 陣列實現 必須是迴圈佇列 需要幾個引數來確定,各引數含義 1 佇列初始化 front和rear值都是0 2 佇列非空 front代表佇列第乙個元素 rear代表佇列最後乙個元素的 下乙個元素 3 佇列空 front和rear相...
資料結構之佇列
與棧相反,佇列是一種先進先出的線性表,它只允許在表的一端進行,而在另一端刪除元 素。在佇列中,允許插入的一端叫做隊尾,允許刪除的一端則稱為隊頭。1 鏈佇列 佇列的鏈式表示和實現 用鍊錶表示的佇列簡稱為鏈佇列,乙個鏈佇列顯然需要兩個分別指示對頭和隊尾的指標 分別稱為頭指 針和尾指標 才能唯一確定。這裡...
資料結構之佇列
一 佇列的介紹 佇列 queue 是一種線性儲存結構。它有以下幾個特點 1 佇列中資料是按照 先進先出 fifo,first in first out 方式進出佇列的。2 佇列只允許在 隊首 進行刪除操作,而在 隊尾 進行插入操作。佇列通常包括的兩種操作 入佇列 和 出佇列。1.佇列的示意圖 佇列中...