佇列的順序儲存結構

Diy_os發表於2015-11-26
佇列的順序儲存結構相對於鏈式儲存結構較為複雜,本文重點介紹佇列順序結構。下面簡單的談兩個問題:
1.
由於是順序佇列,很容易想到用陣列來儲存元素,假如一個佇列的長度是10,就是一下可以放入10個元素,當9個元素出隊後,又放入3個元素,此時是不是要再增長陣列的長度呢?實際中不可能增加陣列的長度而任記憶體空間的浪費,所以我們要構造迴圈佇列,也就是當rear=(佇列的長度-1),下一個入隊元素的位置是rear=(rear+1)%(佇列的長度),同理front也是如此。只要是順序佇列都是迴圈佇列
2.如何判斷什麼時候佇列是空,什麼時候佇列已經滿了呢?這個是實際中不可避免的問題。在順序佇列中,我們通常用front,rear兩個"指標"來進行入隊和出隊的操作,在佇列的初始化時,front=rear,此時佇列為空,這是佇列為空的判斷條件;那麼什麼時候佇列滿了呢,通常留一個儲存空間不儲存元素,此時判斷佇列滿的條件就是(rear+1)%(佇列的長度) =  front,解決了當rear = front時,不知道是隊滿還是隊空的問題。
簡單的介紹了迴圈佇列中的棘手的問題,下面給出簡單實現的程式碼:

點選(此處)摺疊或開啟

  1. #include<iostream>
  2. #define MAX_SIZE 10
  3. using namespace std;

  4. struct Squeue {
  5.     int data[MAX_SIZE];
  6.     int rear, front;
  7. };

  8. void initSqueue(Squeue *);
  9. void emptySqueue(Squeue *);
  10. void fullSqueue(Squeue *);
  11. void Insqueue(Squeue *, int);
  12. void Outsqueue(Squeue *, int *);
  13. void ergodicSqueue(Squeue *);

  14. void initSqueue(Squeue *q) {
  15.     q->front = 0;
  16.     q->rear = 0;
  17. }
  18. void emptySqueue(Squeue *q) {
  19.     if (q->rear == q->front) {                  //判斷佇列空的條件
  20.         cout << "佇列為空!!!" << endl;
  21.         exit(-1);
  22.     }
  23.     else
  24.         return;
  25. }
  26. void fullSqueue(Squeue *q) {
  27.     if ((q->rear + 1) % MAX_SIZE == q->front){   //判斷佇列已滿的條件
  28.     cout << "佇列已滿!!!" << endl;
  29.     exit(-1);
  30.     }
  31.     else
  32.         return;
  33. }
  34. void Insqueue(Squeue *q, int e) {
  35.     fullSqueue(q);                      //入隊時判斷佇列是否已滿
  36.     q->data[q->rear] = e;
  37.     q->rear = (q->rear + 1) % MAX_SIZE;
  38. }
  39. void Outsqueue(Squeue *q, int *e) {
  40.     emptySqueue(q);                     //出隊時判斷佇列是否已空
  41.     *e = q->data[q->front];
  42.     q->front = (q->front + 1) % MAX_SIZE;
  43. }
  44. void ergodicSqueue(Squeue *q) {          //對佇列進行入隊出隊操作後,列印在佇列中的元素
  45.     int i = 0;
  46.     cout << "在佇列中的元素是:";
  47.     while (q->front != q->rear) {
  48.         cout << q->data[q->front] << ",";
  49.         q->front = (q->front + 1) % MAX_SIZE;
  50.         i++;
  51.     }
  52.     cout << endl;
  53.     cout << "佇列中的元素個數為:" << i << endl; //統計佇列中元素的個數
  54. }
  55. int main() {

  56.     Squeue queue;
  57.     int e = 0;
  58.     initSqueue(&queue);
  59.     for (int i = 1; i <= 9; i++) {
  60.         Insqueue(&queue, i);
  61.     }
  62.    
  63.     Outsqueue(&queue, &e);
  64.     cout << "出隊的元素是:" << e << endl;
  65.     Outsqueue(&queue, &e);
  66.     cout << "出隊的元素是:" << e << endl;

  67.     Insqueue(&queue, 10);
  68.     Outsqueue(&queue, &e);
  69.     cout << "出隊的元素是:" << e << endl;
  70.     ergodicSqueue(&queue);
  71. }
執行結果:

以上只是粗略的介紹,當然更為詳細的是畫圖分析該過程,由於畫圖比較繁瑣,這裡不作展示。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29876893/viewspace-1847566/,如需轉載,請註明出處,否則將追究法律責任。

相關文章