1. 程式人生 > >資料結構:迴圈佇列(C語言實現)

資料結構:迴圈佇列(C語言實現)

生活中有很多佇列的影子,比如打飯排隊,買火車票排隊問題等,可以說與時間相關的問題,一般都會涉及到佇列問題;從生活中,可以抽象出佇列的概念,佇列就是一個能夠實現“先進先出”的儲存結構。佇列分為鏈式佇列和靜態佇列;靜態佇列一般用陣列來實現,但此時的佇列必須是迴圈佇列,否則會造成巨大的記憶體浪費;鏈式佇列是用連結串列來實現佇列的。這裡講的是迴圈佇列,首先我們必須明白下面幾個問題

一、迴圈佇列的基礎知識

1.迴圈佇列需要幾個引數來確定

迴圈佇列需要2個引數,front和rear

2.迴圈佇列各個引數的含義

(1)佇列初始化時,front和rear值都為零;

(2)當佇列不為空時,front指向佇列的第一個元素,rear指向佇列最後一個元素的下一個位置;

(3)當佇列為空時,front與rear的值相等,但不一定為零;

3.迴圈佇列入隊的偽演算法

(1)把值存在rear所在的位置;

(2)rear=(rear+1)%maxsize ,其中maxsize代表陣列的長度;

程式程式碼:

  1. bool Enqueue(PQUEUE Q, int val)  
  2. {  
  3.     if(FullQueue(Q))  
  4.         returnfalse;  
  5.     else
  6.     {  
  7.         Q->pBase[Q->rear]=val;  
  8.         Q->rear=(Q->rear+1)%Q->maxsize;  
  9.         returntrue;  
  10.     }  
  11. }  


4.迴圈隊列出隊的偽演算法

(1)先儲存出隊的值;

(2)front=(front+1)%maxsize ,其中maxsize代表陣列的長度;

程式程式碼:

  1. bool Dequeue(PQUEUE Q, int *val)  
  2. {  
  3.     if(EmptyQueue(Q))  
  4.     {  
  5.         returnfalse;  
  6.     }  
  7.     else
  8.     {  
  9.         *val=Q->pBase[Q->front];  
  10.         Q->front=(Q->front+1)%Q->maxsize;  
  11.         returntrue;  
  12.     }  
  13. }  


5.如何判斷迴圈佇列是否為空

if(front==rear)

佇列空;

else

 佇列不空;

  1. bool EmptyQueue(PQUEUE Q)  
  2. {  
  3.     if(Q->front==Q->rear)    //判斷是否為空
  4.         returntrue;  
  5.     else
  6.         returnfalse;  
  7. }  


6.如何判斷迴圈佇列是否為滿


    這個問題比較複雜,假設陣列的存數空間為7,此時已經存放1,a,5,7,22,90六個元素了,如果在往陣列中新增一個元素,則rear=front;此時,佇列滿與佇列空的判斷條件front=rear相同,這樣的話我們就不能判斷佇列到底是空還是滿了;

解決這個問題有兩個辦法:一是增加一個引數,用來記錄陣列中當前元素的個數;第二個辦法是,少用一個儲存空間,也就是陣列的最後一個存數空間不用,當(rear+1)%maxsiz=front時,佇列滿;

  1. bool FullQueue(PQUEUE Q)  
  2. {  
  3.     if(Q->front==(Q->rear+1)%Q->maxsize)    //判斷迴圈連結串列是否滿,留一個預留空間不用
  4.         returntrue;  
  5.     else
  6.         returnfalse;  
  7. }  
附錄:

queue.h檔案程式碼:

  1. #ifndef __QUEUE_H_
  2. #define __QUEUE_H_
  3. typedefstruct queue   
  4. {  
  5.     int *pBase;  
  6.     int front;    //指向佇列第一個元素
  7.     int rear;    //指向佇列最後一個元素的下一個元素
  8.     int maxsize; //迴圈佇列的最大儲存空間
  9. }QUEUE,*PQUEUE;  
  10. void CreateQueue(PQUEUE Q,int maxsize);  
  11. void TraverseQueue(PQUEUE Q);  
  12. bool FullQueue(PQUEUE Q);  
  13. bool EmptyQueue(PQUEUE Q);  
  14. bool Enqueue(PQUEUE Q, int val);  
  15. bool Dequeue(PQUEUE Q, int *val);  
  16. #endif


queue.c檔案程式碼:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include"malloc.h"
  4. #include"queue.h"
  5. /*********************************************** 
  6. Function: Create a empty stack; 
  7. ************************************************/
  8. void CreateQueue(PQUEUE Q,int maxsize)  
  9. {  
  10.     Q->pBase=(int *)malloc(sizeof(int)*maxsize);  
  11.     if(NULL==Q->pBase)  
  12.     {  
  13.         printf("Memory allocation failure");  
  14.         exit(-1);        //退出程式
  15.     }  
  16.     Q->front=0;         //初始化引數
  17.     Q->rear=0;  
  18.     Q->maxsize=maxsize;  
  19. }  
  20. /*********************************************** 
  21. Function: Print the stack element; 
  22. ************************************************/
  23. void TraverseQueue(PQUEUE Q)  
  24. {  
  25.     int i=Q->front;  
  26.     printf("隊中的元素是:\n");  
  27.     while(i%Q->maxsize!=Q->rear)  
  28.     {  
  29.         printf("%d ",Q->pBase[i]);  
  30.         i++;  
  31.     }  
  32.     printf("\n");  
  33. }  
  34. bool FullQueue(PQUEUE Q)  
  35. {  
  36.     if(Q->front==(Q->rear+1)%Q->maxsize)    //判斷迴圈連結串列是否滿,留一個預留空間不用
  37.         returntrue;  
  38.     else
  39.         returnfalse;  
  40. }  
  41. bool EmptyQueue(PQUEUE Q)  
  42. {  
  43.     if(Q->front==Q->rear)    //判斷是否為空
  44.         returntrue;  
  45.     else
  46.         returnfalse;  
  47. }  
  48. bool Enqueue(PQUEUE Q, int val)  
  49. {  
  50.     if(FullQueue(Q))  
  51.         returnfalse;  
  52.     else
  53.     {  
  54.         Q->pBase[Q->rear]=val;  
  55.         Q->rear=(Q->rear+1)%Q->maxsize;  
  56.         returntrue;  
  57.     }  
  58. }  
  59. bool Dequeue(PQUEUE Q, int *val)  
  60. {  
  61.     if(EmptyQueue(Q))  
  62.     {  
  63.         returnfalse;  
  64.     }  
  65.     else
  66.     {  
  67.         *val=Q->pBase[Q->front];  
  68.         Q->front=(Q->front+1)%Q->maxsize;  
  69.         returntrue;  
  70.     }  
  71. }