一、隊列的定義
隊列是一種運算受限制的線性表,它與堆棧的不同之處在於元素的添加在表的一端進行,而元素的刪除在另一端進行。允許添加元素的一端稱為隊尾,允許刪除元素的一端稱為隊頭。隊列的特點是先進先出,后進后出,所以隊列也稱先進先出表。
二、順序隊列
與堆棧類似,隊列最簡單的表示方式是采用一維數組,設數組為data,其下標下界為0,上界為MAXSIZE-1.
一維數組隊列
a | b | c | d | e |
↑front ↑rear
基本操作如下:
(1)順序隊列的初始化:
1 //順序隊列的初始化 2 void InitQueue(sQqueue *q){ 3 q->front=0; 4 q->rear=0; 5 }
(2)求順序隊列的長度:
1 //求順序隊列的長度 2 int QueueLength(sQqueue *q){ 3 int length=(q->rear-q->front+MAXSIZE)%MAXSIZE; 4 return length; 5 }
(3)判斷順序隊列是否為空:
1 //判斷隊列是否為空 2 bool QueueEmpty(sQqueue *q){ 3 return(q->front==q->rear); 4 }
(4)順序隊列的插入:
1 //順序隊列的插入 2 bool QueueInsert(sQqueue *q,int num){ 3 if(q->rear==MAXSIZE){ 4 printf("對滿,插入失敗!"); 5 return false; 6 } 7 q->data[q->rear]=num; 8 q->rear++; 9 return true; 10 }
(5)順序隊列的出隊:
1 //順序隊列的出隊 2 bool QueueDelete(sQqueue *q,int *num){ 3 if(q->front==q->rear){ 4 printf("下溢,出隊失敗!"); 5 return false; 6 } 7 *num=q->data[q->front]; 8 q->front++; 9 return true; 10 }
(6)順序隊列的遍歷:
1 //遍歷順序隊列 2 void DispQueue(sQqueue *q){ 3 int i; 4 i=q->front; 5 while(i!=q->rear){ 6 printf("%d ",q->data[i]); 7 i=(i+1)%MAXSIZE; 8 } 9 printf("\n"); 10 }
整體代碼:

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <stdbool.h> 4 #define null 0 5 #define MAXSIZE 100 6 typedef struct node{ 7 int front; 8 int rear; 9 int data[MAXSIZE]; 10 }sQqueue; 11 //順序隊列的初始化 12 void InitQueue(sQqueue *q){ 13 q->front=0; 14 q->rear=0; 15 } 16 //求順序隊列的長度 17 int QueueLength(sQqueue *q){ 18 int length=(q->rear-q->front+MAXSIZE)%MAXSIZE; 19 return length; 20 } 21 //判斷隊列是否為空 22 bool QueueEmpty(sQqueue *q){ 23 return(q->front==q->rear); 24 } 25 //順序隊列的插入 26 bool QueueInsert(sQqueue *q,int num){ 27 if(q->rear==MAXSIZE){ 28 printf("對滿,插入失敗!"); 29 return false; 30 } 31 q->data[q->rear]=num; 32 q->rear++; 33 return true; 34 } 35 //順序隊列的出隊 36 bool QueueDelete(sQqueue *q,int *num){ 37 if(q->front==q->rear){ 38 printf("下溢,出隊失敗!"); 39 return false; 40 } 41 *num=q->data[q->front]; 42 q->front++; 43 return true; 44 } 45 //遍歷順序隊列 46 void DispQueue(sQqueue *q){ 47 int i; 48 i=q->front; 49 while(i!=q->rear){ 50 printf("%d ",q->data[i]); 51 i=(i+1)%MAXSIZE; 52 } 53 printf("\n"); 54 } 55 int main(){ 56 sQqueue *q; 57 int num; 58 q=(sQqueue *)malloc(sizeof(sQqueue)); 59 InitQueue(q); 60 printf("順序隊列的基本操作:\n"); 61 printf("(1)判斷書序隊列是否為空:"); 62 if(QueueEmpty(q))printf("順序隊列為空\n"); 63 printf("(2)順序隊列入隊:"); 64 if(QueueInsert(q,1))printf("1插入成功! "); 65 if(QueueInsert(q,2))printf("2插入成功! "); 66 if(QueueInsert(q,3))printf("3插入成功! "); 67 if(QueueInsert(q,4))printf("4插入成功! "); 68 if(QueueInsert(q,5))printf("5插入成功! \n"); 69 printf("(3)遍歷順序隊列:"); 70 DispQueue(q); 71 printf("(4)順序隊列出隊:"); 72 if(QueueDelete(q,&num))printf("%d出隊成功!",num); 73 if(QueueDelete(q,&num))printf("%d出隊成功!",num); 74 if(QueueDelete(q,&num))printf("%d出隊成功!\n",num); 75 printf(" 遍歷得順序隊列:"); 76 DispQueue(q); 77 printf("(5)順序隊列的長度為:"); 78 num=QueueLength(q); 79 printf("%d\n",num); 80 }
運行結果:
三、循環隊列
順序隊列經過一段時間的插入和刪除操作,整個隊列的rear指針不斷往后移,最后rear=MAXSIZE,不能再插入數據,而front前面即使由於隊列元素出隊還有很多空間,也不能利用。即“假溢出現象”,假溢出並非出錯狀態,而是不能使空間充分利用。
基本操作如下:
(1)初始化循環隊列
1 //初始化循環隊列 2 void InitQueue(sqQueue *q){ 3 q->front=0; 4 q->rear=0; 5 q->data[0]=0; 6 }
(2)求循環隊列的長度及判斷為滿
1 //求循環隊列的長度 2 int Queuelength(sqQueue *q){ 3 return(q->rear-q->front+MAXSIZE)%MAXSIZE; 4 } 5 //判斷循環隊列是否已滿 6 bool Isfull(sqQueue *q){ 7 return((q->rear+1)%MAXSIZE==q->front); 8 }
(3)循環隊列的入隊
1 //循環隊列的入隊 2 bool pushQueue(sqQueue *q,int num){ 3 if(Isfull(q))return false; 4 q->data[q->rear]=num; 5 q->rear=(q->rear+1)%MAXSIZE; 6 return true; 7 }
(4)循環隊列的出隊
1 //循環隊列的出隊 2 bool popQueue(sqQueue *q,int *num){ 3 if(q->front==q->rear)return false; 4 *num=q->data[q->front]; 5 q->front=(q->front+1)%MAXSIZE; 6 return true; 7 }
(5)循環隊列的遍歷
1 //循環列表的遍歷 2 void DispQueue(sqQueue *q){ 3 int i=q->front; 4 while(i!=q->rear){ 5 printf("%d ",q->data[i]); 6 i++; 7 } 8 printf("\n"); 9 }
整體代碼:

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <stdbool.h> 4 #define null 0 5 #define MAXSIZE 100 6 typedef struct{ 7 int data[MAXSIZE]; 8 int front; 9 int rear; 10 }sqQueue; 11 //初始化循環隊列 12 void InitQueue(sqQueue *q){ 13 q->front=0; 14 q->rear=0; 15 q->data[0]=0; 16 } 17 //求循環隊列的長度 18 int Queuelength(sqQueue *q){ 19 return(q->rear-q->front+MAXSIZE)%MAXSIZE; 20 } 21 //判斷循環隊列是否已滿 22 bool Isfull(sqQueue *q){ 23 return((q->rear+1)%MAXSIZE==q->front); 24 } 25 //循環隊列的入隊 26 bool pushQueue(sqQueue *q,int num){ 27 if(Isfull(q))return false; 28 q->data[q->rear]=num; 29 q->rear=(q->rear+1)%MAXSIZE; 30 return true; 31 } 32 //循環隊列的出隊 33 bool popQueue(sqQueue *q,int *num){ 34 if(q->front==q->rear)return false; 35 *num=q->data[q->front]; 36 q->front=(q->front+1)%MAXSIZE; 37 return true; 38 } 39 //循環列表的遍歷 40 void DispQueue(sqQueue *q){ 41 int i=q->front; 42 while(i!=q->rear){ 43 printf("%d ",q->data[i]); 44 i++; 45 } 46 printf("\n"); 47 } 48 int main(){ 49 sqQueue *q; 50 int num; 51 q=(sqQueue *)malloc(sizeof(sqQueue)); 52 InitQueue(q); 53 printf("循環隊列的基本操作:\n"); 54 printf("(1)初始化循環隊列並入隊\n"); 55 pushQueue(q,1); 56 pushQueue(q,2); 57 pushQueue(q,3); 58 pushQueue(q,4); 59 pushQueue(q,5); 60 pushQueue(q,6); 61 printf("(2)循環隊列的遍歷:"); 62 DispQueue(q); 63 printf("(3)循環隊列的出隊:"); 64 popQueue(q,&num); 65 printf("出隊%d ",num); 66 popQueue(q,&num); 67 printf("出隊%d\n",num); 68 printf(" 遍歷隊列:"); 69 DispQueue(q); 70 }
運行結果:
如有錯誤,歡迎指正交流(qq:2991337561)!!