1. 隊列概述
隊列和堆棧都是有序列表,屬於抽象型數據類型(ADT),所有加入和刪除的動作都發生在不同的兩端,並符合First In, First Out(先進先出)的特性。
特性:
·FIFO
·擁有兩種基本操作,即加入與刪除,而且使用front與rear兩個指針來分別執行隊列的前端與尾端。
如定義int[] queue= new int[int max];
當rear為max-1時,認為隊列已滿(Queue-Full),新的數據不能再加入。此時可以將隊列中的數據往前挪移,移除空間讓新數據加入。
這種在隊列中移動數據的做法雖可以解決隊列空間浪費的問題,但如果隊列中的數據過多時,將會造成時間的浪費。
以鏈表實現隊列:
class QueueNode{ int data; QueueNode next; public QueueNode(int data){ this.data = data; next = null; } } class Linked_List_Queue { public QueueNode front; public QueueNode rear; public Linked_List_Queue(){front=null; rear=null;} //隊列數據的存入 public Boolean enqueue(int value){ QueueNode node = new QueueNode(value); if(rear==null) front=node; else rear.next = node; rear= node; return true; } public int dequeue(){ int value; if(!(front==null)){ if(front==rear) rear=null; value = front.data; front = front.next; return value; } else return -1; } }
隊列在計算機領域的應用:
1. 在圖形遍歷的先廣后深搜索法(BFS)
2. 用於計算機的模擬(simulation)
3. CPU的工作調度等。
2.環形隊列
線性隊列有空間浪費的問題,可以利用環形隊列來解決。它是Q(0:n-1)的一維數組,同事Q(0)為Q(n-1)的下一個元素。
其中,指針front用於以逆時針方向指向隊列中第一個元素的前一個位置,rear則指向隊列當前的最后位置。一開始front和rear均預設為-1,表示為空隊列。也就是說
如果front=rear則為空隊列。
這樣設計的好處是,環形隊列為空隊列和滿隊列時,front和rear都會指向同一個地方。為更方便我們判斷,我們僅允許隊列最多存放n-1個數據(亦即犧牲最后一個空間),
當rear指針的下一個是front的位置時,就認定隊列已滿,無法再將數據加入。所以一個Q(0:n-1)的環形隊列最多只能放n-1個元素。
3.優先隊列
優先隊列(priority queue)為一種不必遵守隊列特性--FIFO的有序表,其中的每一個元素都賦予一個優先權(Priority),加入元素時可任意加入,但有最高優先權者(Highest Priority Out First, HPOF)則最先輸出。
在計算機中CPU的工作調度,優先權調度(Priority Scheduling, PS)就是一種挑選任務的“調度算法”(Scheduling Aalgotithm),也會使用到優先隊列。級別高的用戶,就比一般用戶擁有較高的權利。
當各元素以輸入先后次序為優先權時,就是一般的隊列,假如是以輸入先后次序作為最不優先權時,此優先隊列即為一堆棧。
4.雙向隊列
雙向隊列(Double-ends Queues),是一種前后兩段都可輸入或讀取數據的有序表。
在雙向隊列中,我們仍使用兩個指針,分別指向加入及取回端,只是加入和取回數據時,各指針所扮演的角色不再是固定的加入或取回。而且兩邊的指針都向隊列中央移動,其他部分則和一般隊列無異。
code加入個人github:interesting_code中。