隊列(Queue)--環形隊列、優先隊列和雙向隊列


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中。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM