像棧一樣,佇列(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...