什麼是佇列?佇列就是乙個隊伍,佇列和棧一樣,由一段連續的儲存空間組成,是乙個具有自身特殊規則的資料結構,我們都知道棧的先進後出的規則,而佇列剛好相反,是乙個先進先出的(fifo)或者說後進後出(lilo)的資料結構。
佇列的是一種受限制的資料結構,插入操作只能從一端操作,這一端叫做隊尾,而移除操作也只能從另一端操作,這一端叫隊頭。我們把插入和移除操作分別叫做入隊和出隊。
一般而言,佇列的實現有兩種方式,陣列和鍊錶,用陣列實現佇列有兩種方式,一種是順序佇列,一種是迴圈佇列。在順序儲存方式中,佇列會有兩個標記。
出隊:一開始兩個標記都指向陣列下標0的位置,分別為head(隊頭指標)和tail(隊尾指標)。當乙個元素入隊後,tail指標會響應地加1;
入隊:當有乙個元素進行出隊操作,即這個元素從隊頭移除了,此時head指標會相應地往後移動一位,此時新佇列的隊頭就是原來佇列的第二個元素。
思考乙個問題:當乙個順序佇列進入若干個元素後,佇列已經滿了,不能再進行入隊操作了,我們稱之為「真上溢」,此時我對其中的一部分元素進行出隊操作,那麼佇列此時已經不是滿的狀態了,但是我們仍然不能進行入隊操作,這種狀態我們稱之為「假上溢」。那麼如何解決假上溢的問題呢?這時就要用到儲存的第二種方式,迴圈佇列了。
當順序佇列出現假上溢的時候,其實佇列前端還有空間,我們可以不用把標記指向陣列外的地方,只需要把標記重新指向開始的地方就可以了。就是把這個陣列首尾連線,成為乙個圈,那麼此時我們又能進行入隊操作。這樣就解決了「假上溢」的問題
其實,如果細心的同學還會發現乙個問題,如果使用迴圈佇列的方式,當隊列為空以及佇列滿的時候,head和tail指標都是出於重疊的狀態,這就會出現歧義了,這會讓我們分辨不清當head和tail重疊的時候,佇列是空的還是對滿狀態。一般情況,我們為了區分,一般在迴圈佇列中規定佇列的長度為所儲存陣列的長度減去1,即有乙個位置不放元素。這樣的話,當head==tail時,說明隊列為空,當head == (tail +1)%length時,隊列為滿的狀態
public class arrayqueue
/*** put item into queue
* @param item
* @return
*/public boolean put(object item)
items[tail] = item;
tail = (tail+1) % items.length;
return true;
} /**
* get the head element
* @param head
* @return
*/public object peek()
return items[head];
}/**
* poll a element
* @return
*/public object poll()
object item = items[head];
items[head] =null;
head = (head+1) % items.length;
return item;
} /**
* isfull
* @return
*/public boolean isfull()
/*** isempty
* @return
*/public boolean isempty()
/*** get queue size
* @return
*/public int size() else
}
public static void main(string args)
}
在一般程式中,會將佇列作為緩衝器或者解耦使用
還有乙個重要的應用就是佇列與生產者消費者設計模式的應用,在佇列的隊尾對接的是生產者,在隊頭對接的就是消費者。生產者把生產號的產品進行入隊操作,在隊頭消費者去消費出隊的產品。因此,對於生產者和消費者來說,有一點是非常重要的,那就是生產的速度和消費的水平要持平,如果生產得太快,而消費得太慢,那麼佇列就會很長,對於計算機來說,這樣占用的空間就會很大。
nbd 相關概念及操作
周五 3月6號 筆者發現有台物理機上掛載了乙個並非常用的nbd裝置,估計是之前人做的測試留下來的,決定解除安裝它,順帶了解了下nbd的裝置資訊。什麼是nbd 全稱是network block device,類似於nfs,遠端裝置可以掛載,只不過掛載的不再是檔案系統,而是塊裝置。nbd一般分為clie...
python基礎 類的相關概念及操作
一 類的基本概念 class dog def init self,name,age self.name name self.age age def sit self print self.name.title is now sitting.def roll over self print self....
靜態鍊錶相關概念及其操作
靜態鍊錶結構 首先我們先來看看靜態鍊錶的結構定義 typedef structcomponent,staticlinklist maxsize status initlist staticlinklist l l maxsize 2 cur 0 備用鍊錶的表尾 l maxsize 1 cur 0 資...