資料結構之佇列

首頁 > 科技

資料結構之佇列

來源:減肥餐搭配 釋出時間:2023-04-06 15:11

我們繼承為大家先容新的資料結構,今天我們要先容的資料結構是:佇列

相信大家或多或少的都聽說過這個資料結構,但是在實際的業務開發頂用的並不多。實在這個資料結構在一些中介軟體、偏底層系統、框架(好比執行緒池、連線池)頂用的仍是許多的。我們一起來看看佇列的定義。

定義

之前我們瞭解過,棧是隻能在一端插入或者刪除資料的線性表,而佇列與棧類似,佇列也是一種操縱受限的線性表,我們來看下佇列的示意圖:

我們可以看出,與棧不同,佇列擁有“進步者先出,後進者後出”的特性,同時佇列也只支援兩種操縱,一個是在隊尾進行入隊操縱,一個是在對頭進行出隊操縱。

實在佇列的隊,就是排隊的隊。就跟做核酸排隊一樣,先到的先做,後來的只能排到隊尾,不答應插隊。對頭的第一位做完核酸後,出隊,隊裡面所有的人都往前一步,然後接著做核酸。做完核酸的人離開,那就是出隊,還沒做核酸的人來排隊,那就是入隊。

在上述做核酸的例子中,當對頭的人做完核酸離隊後,所有步隊中的人都要往前一步,才能讓隊頭的人繼承做核酸,但是在計算機場景中,佇列中的資料都是放在記憶體中的,假如每次有資料出隊都要把所有的資料挪動一次,那對計算機機能的開銷是非常大的。因此計算機內部為了避免每次出隊都要把所有的資料進行挪動,採用了隊頭指標和隊尾指標的設計。

當佇列為空時,隊頭指標和隊尾指標指向統一塊記憶體。當入隊時,隊尾指標挪動。當出隊時,隊頭指標挪動。

跟棧類似,佇列中的資料也需要儲存在基本的資料結構中,底層資料儲存在陣列上的佇列叫做順序佇列。底層資料儲存在連結串列上的佇列叫做鏈式佇列。

基於底層資料結構的特性,順序佇列是一個有界佇列。佇列的大小有限,因此可以進來排隊的資料數目也有限。當佇列滿了後,後面的入隊哀求就會被拒絕掉。有界佇列合用於對響應時間敏感的業務場景,好比購買火車票的排隊,超過XXX人後,剩下來排隊的人就直接告訴他已經沒有票了。

而鏈式佇列因為底層資料結構是連結串列,因此它是一個無界的佇列,即它支援資料的無窮排隊。好比做核酸的排隊,只有你的場地(記憶體)夠大,那就可以一直增加人來排隊。但是,在其中排隊的人可能要等上很久才能做上核酸。同理,在無界佇列中,固然資料可以無窮來排隊,但是在佇列中的資料可能良久才會得到處理。

輪迴佇列

我們來看下面一個順序佇列,底層是一個長度為8的陣列:

這個時候依次入隊七個資料A、B、C、D、E、F、G,如下

這個時候,實在佇列已經滿了,由於當隊尾再入隊一個數據時,隊尾指標假如再往前移動一位,那隊尾指標就已經越界了。因此,因為佇列大小的問題,此時已經不能再入隊了。

此時,隊頭的資料A、B依次出隊了,如下:

上面我們說過,為了減少資料挪動的機能開銷,我們採取的是移動指標的方式進行出隊操縱,因此此時隊尾指標指向的記憶體地址不變,而隊頭指標指向的記憶體地址變成了地址2。目前這個佇列的長度為8,佇列裡只有5個數據,那還能往佇列裡入隊資料嗎?

理論上是可以的,由於佇列沒滿,實際上卻是不行,由於隊尾指標已經退無可退了。那應該怎麼辦呢?把佇列裡的資料整體挪動一次,同時變更隊尾指標和隊頭指標指向的地址,如下:

上一篇:平安銀行黃金... 下一篇:如何用手機快...
猜你喜歡
熱門閱讀
同類推薦