佇列(queue)原理

2021-07-24 16:35:17 字數 1315 閱讀 4631

像棧一樣,佇列(queue)也是一種線性表,它的特性是先進先出,插入在一端,刪除在另一端。就像排隊一樣,剛來的人入隊(push)要排在隊尾(rear),每次出隊(pop)的都是隊首(front)的人。如圖1,描述了乙個佇列模型。

佇列(queue)與棧一樣,是一種線性儲存結構,它具有如下特點:

佇列中的資料元素遵循「先進先出」(first in first out)的原則,簡稱fifo結構。

在隊尾新增元素,在隊頭刪除元素。

回到頂部

佇列的相關概念:

隊頭與隊尾: 允許元素插入的一端稱為隊尾,允許元素刪除的一端稱為隊頭。

入隊:佇列的插入操作。

出隊:佇列的刪除操作。

例如我們有乙個儲存整型元素的佇列,我們依次入隊:

新增元素時,元素只能從隊尾一端進入佇列,也即是2只能跟在1後面,3只能跟在2後面。

如果佇列中的元素要出隊:

元素只能從隊首出佇列,出佇列的順序為:1、2、3,與入隊時的順序一致,這就是所謂的「先進先出」。

佇列通常提供的操作:

入隊: 通常命名為push()

出隊: 通常命名為pop()

求佇列中元素個數

判斷佇列是否為空

獲取隊首元素

佇列與棧一樣是一種線性結構,因此以常見的線性表如陣列、鍊錶作為底層的資料結構。

本文中,我們以陣列、鍊錶為底層資料結構構建佇列。

以陣列作為底層資料結構時,一般講佇列實現為迴圈佇列。這是因為佇列在順序儲存上的不足:每次從陣列頭部刪除元素(出隊)後,需要將頭部以後的所有元素往前移動乙個位置,這是乙個時間複雜度為o(n)的操作:

可能有人說,把隊首標誌往後移動不就不用移動元素了嗎?的確,但那樣會造成陣列空間的「流失」。

我們希望佇列的插入與刪除操作都是o(1)的時間複雜度,同時不會造成陣列空間的浪費,我們應該使用迴圈佇列。

所謂的迴圈佇列,可以把陣列看出乙個首尾相連的圓環,刪除元素時將隊首標誌往後移動,新增元素時若陣列尾部已經沒有空間,則考慮陣列頭部的空間是否空閒,如果是,則在陣列頭部進行插入。

佇列(queue)原理及實現

目錄 序言 佇列簡介 一 順序儲存結構及實現 二 迴圈佇列 三 鏈式儲存結構及實現 四 雙向佇列 佇列是一種特殊的線性表,它只允許在表的前端 front 進行刪除操作,只允許在表的後端 rear 進行插入操作。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。根據其特徵,把佇列簡稱為先進先出 fi...

queue的長度 佇列 Queue

佇列 queue 是先進先出 fifo,first in first out 的線性表。在具體應用中通常用鍊錶或者陣列來實現。佇列只允許在後端 稱為rear 進行插入操作,在前端 稱為front 進行刪除操作。隊結構 迴圈佇列可以更簡單防止偽溢位 假溢位 的發生,但佇列大小是固定的。防止假溢位,如d...

併發佇列Queue

乙個是以concurrentlinkedqueue為代表的高效能佇列,乙個是以blockingqueue為介面代表的阻塞佇列,都繼承自queue。concurrentlinkedqueue 是乙個適用高併發場景下的佇列,通過無鎖的方式,實現了高併發狀態下的高效能,通常concurrentlinged...