1. 程式人生 > 實用技巧 >計算機基礎資料結構講解第十篇-鏈佇列

計算機基礎資料結構講解第十篇-鏈佇列

  本篇介紹佇列的鏈式儲存,因為佇列是在兩頭插入和刪除的邏輯結構,因此要用具體的物理儲存結構的時候,需要用到兩個指標。一個是頭指標,一個是尾指標。頭指標指向隊頭指標,尾指標指向隊尾指標,即單鏈表的最後一個結點。下面介紹有關鏈佇列的演算法實現。

一:佇列的鏈式儲存型別

typedef struct{
  ElemType data;
  struct LinkNode *next;
}LinkNode;
typedef struct{
  LinkNode *front,*rear;
}LinkQueue

  當Q.front == NULL且Q.rear == NULL,鏈式佇列為空。
  入隊時,先建立一個新結點,然後將新結點插入到連結串列的尾部,並讓Q.rear指向這個新插入的結點,若原佇列為空,讓Q.rear也指向這個結點。
  出隊時,先取隊頭元素,將其從連結串列中刪除,並讓Q.front指向下一個結點,若該結點是最後一個結點,則置Q.front與Q.rear都為NULL。
  上面的是不帶頭結點的鏈佇列,如果需要簡單操作,則需要將佇列設計成一個帶頭結點的單鏈表。
  使用鏈佇列不會出現儲存分配不合理和"溢位"的問題。適合需要多個佇列的演算法問題。

二:鏈佇列的基本操作

1.初始化

void InitQueue(ListQueue &Q){
  Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));
  Q.front -> next = NULL;
}

2.判隊空

bool IsEmpyt(LinkQueue Q){
  if(Q.front == Q.rear) return true;
  else return false;
}

3.入隊

void EnQueue(LinkQueue &Q,ElemType x){
  LinkQueue *s = (LinkNode*)malloc(sizeof(LinkNode));
  s->data = x;
  s->next = NULL;
  Q.rear->next = s;
  Q.rear = s;
}

4.出隊

bool DeQueue(LinkQueue &Q,ElemType &x){
  if(Q.front == Q.rear) retun false;
  LinkNode *p = Q.front->next;
  x = p->data;
  Q.front->next = p->next;
  if(Q.rear == p)
    Q.rear = Q.front;         //若原佇列中只有一個結點,刪除後變空
  free(p);
  return true;
}

三:佇列的應用

1.雙端佇列

  雙端佇列是指允許兩端都可以進行入隊和出隊的佇列,也有輸入受限的雙端佇列和輸出受限的雙端佇列,在實際應用中用到的地方也有很多。

2.其他應用

  棧在括號匹配和表示式求值中用處很多,以及所有用到遞迴的演算法都可用棧來實現其非遞迴演算法。
  對於佇列來說,佇列在二叉樹層次遍歷以及計算機系統中用處廣泛,在印表機列印和CPU資源競爭處理中用處也很廣泛。

3.矩陣的壓縮儲存

  陣列是線性表的推廣,所以可以用陣列類似棧或者佇列進行一些複雜操作,最常用的就是矩陣的壓縮儲存操作,可以類似棧或者佇列進行操作。