數據結構(七)——隊列

隊列的定義:

    隊列是隻允許在一端進行插入操作,在另一端進行刪除操作的線性表。允許插入的一端稱爲隊尾,另一端爲隊頭


隊列有兩種存儲方式,先來看隊列的數序存儲結構:

循環隊列定義:頭尾相接的順序存儲結構稱爲循環隊列。那怎麼判斷隊列是空還是滿呢?

方法1:設置一個flag標誌變量,當front==rear且flag==0時隊列爲空,當front==rear且flag=1時隊列爲滿。
方法2:隊列空時,條件是front==rear,隊列滿時,修改其條件保留一個空間元素,我們認爲隊列滿了。

下面主要介紹第二種方法:

若隊列的最大尺寸是QueueSize,那麼隊列滿的條件是(rear+1)%QueueSize == front。隊列的長度計算公式爲(rear-front+QueueSize)%QueueSize。

[cpp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. /*循環隊列的順序存儲結構*/  
  2. typedef struct  
  3. {  
  4.     int data[MAXSIZE];  
  5.     int front;  /*頭指針*/  
  6.     int rear;   /*尾指針*/  
  7. }SqQueue;  
  8. /*初始化一個隊列*/  
  9. int init(SqQueue *Q)  
  10. {  
  11.     Q->front = 0;     
  12.     Q->rear = 0;  
  13.     return success;  
  14. }  
  15. /*返回Q的元素個數,也就是隊列的當前長度*/  
  16. int length(SqQueue Q)  
  17. {  
  18.     return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;  
  19. }  
  20. /*入隊操作*/  
  21. int EnQueue(SqQueue *Q,int e)  
  22. {  
  23.     if((Q->rear + 1) % MAXSIZE == Q->front)   //隊列滿  
  24.     {  
  25.     return error;  
  26.     }  
  27.     Q->data[Q->rear] = e; //將元素e賦值給隊尾  
  28.     Q->rear = (Q->rear + 1) % MAXSIZE;   //指針後移  
  29.     return success;  
  30. }  
  31. /*出隊*/  
  32. int DeQueue(SqQueue *Q,int e)  
  33. {  
  34.     if(Q->front == Q->rear)    //隊列空的判斷  
  35.     {  
  36.     return error;  
  37.     }  
  38.     *e = Q->data[Q->front];  
  39.     Q->front = (Q->front + 1) % MAXSIZE;  
  40.     return success;  
  41. }  

隊列的鏈式存儲結構,其實就是線性表的單鏈表,只不過它只能尾進頭出,我們簡稱之爲鏈隊列。如下圖:


[cpp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <span style="font-size:18px;">//鏈式結點結構  
  2. typedef struct QNode  
  3. {  
  4.     int data;  
  5.     struct QNode *next;  
  6. }QNode,*QueuePtr;  
  7.   
  8. //隊列的鏈表結構  
  9. typedef struct  
  10. {  
  11.     QueuePtr front,rear;  //隊頭,隊尾指針  
  12. }LinkQueue;  
  13.   
  14. //入隊操作,其實就是尾插入  
  15. int EnQueue(LinkQueue *Q,int e)  
  16. {  
  17.     QueuePtr s = (QueuePtr)malloc(sizeof(QNode));  
  18.     if(!s)       //分配失敗  
  19.     {  
  20.     printf("分配失敗\n");  
  21.     }  
  22.     s->data = e;  
  23.     s->next = NULL;  
  24.     Q->next->next = s;  
  25.     Q->rear =s;  
  26.     return success;  
  27. }  
  28. /*出隊操作,頭結點的後繼結點出隊*/  
  29. int DeQueue(LinkQueue *Q,int *e)  
  30. {  
  31.     QueuePtr p;  
  32.     if(Q->front == Q->rear)  
  33.     {  
  34.     return error;  
  35.     }  
  36.     p = Q->front->next;  
  37.     *e = p->data;  
  38.     Q->front->next = p->next;  
  39.     if(Q->rear == p)  
  40.     {  
  41.     Q->rear = Q->front;  
  42.     }  
  43.     free(p);  
  44.     return success;  
  45. }</span>  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章