常見基本數據結構——隊列

隊列ADT數組

像棧同樣,隊列也是一種表。然而使用隊列時插入在一端進行而刪除在另外一端進行。數據結構

 隊列模型測試

隊列的基本操做是Enquene(入隊),它在表的末端插入一個元素,還有Dequene(出隊),它是刪除在表的開頭的元素。ui

隊列的數組形式spa

如同棧的形式同樣,對於隊列而言任何表的實現都是合法的。就像棧同樣,對於每一種操做,鏈表實現和數組實現都給出快速的O(1)運行時間。code

對於隊列數據結構,咱們保留一個數組Quene[]以及位置Front和Rear,它們表明隊列的兩端。咱們還要記錄實際存在於隊列中的元素的個數size。全部這些信息是做爲一個結構的一部分,除隊列例程自己外一般不會有例程直接訪問它們。blog

當一個元素X入隊時,咱們讓Size和Rear增長1,而後至Quene[Rear]=X。若使一個元素出隊,咱們置返回值爲Quene[Front],而後Size減1,而後使Front增長1。隊列

一個存在的問題是,當入隊了較多元素時,Rear會到達數組的末端,下一個位置多是不存在的,可是數組中的空間可能有較多剩餘。ip

簡單的解決辦法是,只要Front和Rear到達數組的尾端,它就又繞回開頭。這叫作循環數組實現。ci

實現迴繞所須要附加的代碼是極小的(雖然它可能使得運行時間加倍)。若是Front或者Rear增長1使得超越了數組,那麼其值就要重置爲數組的第一個位置。

關於隊列的循環實現,有兩件事情要警戒,第一:檢測隊列是否爲空;第二,存在多種表示隊頭和隊尾的操做。例:不使用單元來表示隊列的大小,而是依靠基準狀況,當隊列爲空時Rear=Front-1。隊列的大小經過比較Rear和Front來實現的。若是數組的大小爲ASize時,當有ASize-1個元素時就表示隊列滿了。

 

隊列的聲明

struct QueueRecord;
typedef struct QueueRecord *Queue;

struct QueueRecord{
  int Capacity;
  int Front;
  int Rear;
  int Size;
  ElementType *Array;
}

測試隊列是否爲空

void
IsEmpty(Queue Q){
  return Q->Size == 0;
}

構造空隊列的例程

void
MakeEmpty(Queue Q){
  Q->Size = 0;
  Q->Front = 1;
  Q->Rear = 0;
}

入隊的例程

static int
Succ(int Value, Queue Q){
  if(++Value == Q->Captity){
    Value = 0;
  }
  return Value;
}


void Enqueue(ElementType X, Queue Q){   if(IsFull(Q))     Error();   else{     Q->size++;     Q->Rear = Succ(Q->Rear, Q);     Q->Array[Q->Rear] = X;   } }
相關文章
相關標籤/搜索