循環隊列

隊列:

    只允許在一端進行插入操作,另一端進行刪除操作的線性表

循環隊列:

    隊列的頭尾相接的順序存儲結構稱爲循環隊列

    front指向第一個元素,rear指向最後一個元素的下一個位置

    隊空front==rear

    隊空和隊滿的時候條件是一樣的,我們有兩種解決辦法,首先是設置一個標識位,用來區別隊空和隊滿的。其次是少用一個單元,即當只有一個單元的時候,我們就認爲隊滿了。我們使用下一種方法,即犧牲一個單元格。

    隊滿:因爲有以下兩種情況,rear大於front和rear小於front,所以我們不能簡單的使用rear+1==front來判斷了,必須使用(rear+1)%QueueSize == front

    隊長:同上,也是有兩種情況,一種是rear大於front時(rear-front),另一種爲rear小於front,(QueueSize-front+rear),所以通用的公式爲(QueueSize-front+rear)%QueueSize

 

 

  1. #define MAXSIZE 40 
  2. typedef int ElemType; 
  3. typedef struct SqQueue{ 
  4.      ElemType data[MAXSIZE]; 
  5.      int front; 
  6.      int rear; 
  7. }SqQueue,*pSqQueue 
  8.  
  9. void initQueue(pSqQueuue pQ){ 
  10.      Q->front = 0; 
  11.      Q->rear = 0; 
  12.  
  13. int QueueLength(SqQueue Q){ 
  14.     return (Q.rear+MAXSIZE-Q.front)%MAXSIZE;//求隊長  
  15.  
  16. bool EnQueue(pSqQueue pQ,ElemType e){ 
  17.     if((pQ->rear+1)%MAXSIZE)==pQ->front){//判斷隊滿  
  18.         return false
  19.     } 
  20.     pQ->data[pQ->rear] = e; 
  21.     pQ->rear = (pQ->rear+1)%MAXSIZE;//尾指針移位  
  22.     return true
  23.  
  24. bool DeQueue(pSqQueue pQ,ElemType *e){ 
  25.     if((pQ->rear) == (pQ->front)){//判斷隊空  
  26.         return false
  27.     } 
  28.     *e = pQ->data[pQ->front]; 
  29.     pQ->front = (pQ->front+1)%MAXSIZE;//頭指針移位  
  30.     return true

    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章