一、什麼是隊列
1、隊列(簡稱作隊,Queue)是一種特殊的線性表,差別是線性表允許在任意位置插入和刪除,而隊列只允許在其一端進行插入操作在其另一端進行刪除操作。
2、隊列的插入操作通常稱作入隊列,隊列的刪除操作通常稱作出隊列。
3、隊列的底層數據結構可以用數組來實現。
4、隊列具有FIFO(先進先出)的特點。
二、3種隊列的介紹
Java 集合中的 Queue 繼承自 Collection 接口 ,Deque, LinkedList, PriorityQueue, BlockingQueue 等類都實現了它。
1、順序隊列
特點
順序隊列是常見的隊列,從隊尾添加元素,從對頭刪除元素。
假溢出問題
PS:圖片來源教材書籍
缺點
容易發生假溢出問題,當然如果確定不會發生溢出,也可以採用順序隊列
2、循環隊列
如果隊尾指針到達最後的時候,如果再往裏面增加元素,我們使隊尾指針指向隊列的頭部。
循環隊列解決假溢出
問題
判斷隊列是滿的還是空
front=(read+1) % length;
缺點
要求初始化時循環隊列必須確定一個固定的長度,所以有儲存元素個數的限制和浪費空間的問題;
3、鏈式隊列
解決了普通隊列的一些不足,那就是在空間上,鏈式隊列更加靈活
用單鏈表存儲隊列,稱爲鏈隊列。
定義front指針指向頭結點,rear指針指向終端結點,空隊列時,front和rear都指向頭結點。
特點
鏈隊列沒有溢出的問題,只有當內存沒有可用空間時纔會出現溢出,但是每個元素都需要一個引用域,從而產生了結構性開銷。
4、優先隊列
優先隊列(PriorityQueue)是不同於普通隊列的先進先出的隊列,每次從隊列中取出的是具有最高優先權的元素
案例:銀行排隊,vip客戶優先
PriorityQueue是從JDK1.5開始提供的新的數據結構接口。
如果不提供Comparator的話,優先隊列中元素默認按自然順序排列,也就是數字默認是小的在隊列頭,字符串則按字典序排列。