前言:
一. 什麼是佇列
二. 佇列的實際應用
三. 佇列的**實現
1. 陣列實現(順序佇列)
2. 迴圈佇列(基於陣列)
3. 鍊錶實現(鏈式佇列)
想必大家都有過在車站排隊買票的經驗吧,先來的排在前面,後來的依次往後排,當排在最前面的買到票則退出佇列,這時排在後面的則跟上。其實這跟資料結構中的佇列是同乙個原理,先進先出。
在實際應用中,不止車站的排隊,幾乎針對所有有限的資源基本都運用了這一原理。例如,當執行緒池中的資源被用完了,那麼當外部再申請執行緒時,執行緒池便可以採用排隊的策略來處理該申請。
對於要支援多少的申請進行排隊申請則取決於我們採用的是什麼資料結構來實現佇列了。
佇列是一種先進先出的線性結構;
其與棧類似也是一種邏輯結構,也是一種操作受限的線性資料結構,都可通過陣列實現,也可通過鍊錶實現。
其中通過陣列實現的佇列叫順序佇列,通過鍊錶實現的佇列叫鏈式佇列。
佇列與棧類似也同樣也只有兩個操作,乙個是入隊 enqueue(),另乙個是出隊 dequeue();其中入隊是在隊尾追加乙個元素,出隊則是從尾頭移出乙個元素。操作簡易圖如下所示:
佇列的分類:
鏈式佇列與順序佇列的區別:
應用二:網路爬蟲將待分析的網路對應的url寫入佇列然後按照佇列fifo的方式進行解析。
應用三:類似「生產者與消費者」的模式,如訊息佇列,對應的例項有kafka。
應用四:併發佇列、阻塞佇列。基於陣列的迴圈佇列利用cas原子操作,可以實現非常高效的併發佇列。這也是迴圈佇列比鏈式佇列應用更加廣泛的原因。
public class arrayqueue
/* * 入隊: 1.堆滿的時,入隊失敗 1.1頻繁出入隊,造成陣列使用不連續 1.2在入隊的時候,集中觸發進行資料搬移
* 2.在末尾插入資料,注意tail指向隊尾元素的索引+1
*/public boolean enqueue(string item)
head = 0;
tail = tail - head;
} // 將資料加入佇列
items[tail++] = item;
size++;
return true;
} // 出隊:1.隊空時,出隊失敗;2.出隊,head索引+1
public string dequeue()
}
public class looparrayqueue
// 入隊:關鍵在於隊滿的條件
public boolean enqueue(string item)
// 出隊:關鍵在於隊空的條件
public string dequeue()
}
public class linkedqueue
// 記錄佇列元素個數
private int size = 0;
// head指向隊頭結點,tail指向隊尾節點
private node head;
private node tail;
// 申請乙個佇列
public linkedqueue()
// 入隊
public boolean enqueue(string item)
// 出隊
public string dequeue()
}
該系列博文為筆者學習《資料結構與演算法之美》的個人學習筆記小結 資料結構之佇列
八 佇列 鏈式佇列 鍊錶實現 隊尾 rear 隊首 front 靜態佇列 陣列實現 必須是迴圈佇列 需要幾個引數來確定,各引數含義 1 佇列初始化 front和rear值都是0 2 佇列非空 front代表佇列第乙個元素 rear代表佇列最後乙個元素的 下乙個元素 3 佇列空 front和rear相...
資料結構之佇列
與棧相反,佇列是一種先進先出的線性表,它只允許在表的一端進行,而在另一端刪除元 素。在佇列中,允許插入的一端叫做隊尾,允許刪除的一端則稱為隊頭。1 鏈佇列 佇列的鏈式表示和實現 用鍊錶表示的佇列簡稱為鏈佇列,乙個鏈佇列顯然需要兩個分別指示對頭和隊尾的指標 分別稱為頭指 針和尾指標 才能唯一確定。這裡...
資料結構之佇列
一 佇列的介紹 佇列 queue 是一種線性儲存結構。它有以下幾個特點 1 佇列中資料是按照 先進先出 fifo,first in first out 方式進出佇列的。2 佇列只允許在 隊首 進行刪除操作,而在 隊尾 進行插入操作。佇列通常包括的兩種操作 入佇列 和 出佇列。1.佇列的示意圖 佇列中...