資料結構之佇列

2021-08-21 12:45:35 字數 1987 閱讀 8369

像棧一樣,佇列也是一種線性表。它允許在表的一端插入資料,在另一端刪除元素。插入元素的這一端稱之為隊尾。刪除元素的這一端我們稱之為隊首。佇列的結構如下圖所示。

佇列的特性:

順序佇列的實現

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.佇列的示意圖 佇列中...