一、队列的定义
队列是一种运算受限制的线性表,它与堆栈的不同之处在于元素的添加在表的一端进行,而元素的删除在另一端进行。允许添加元素的一端称为队尾,允许删除元素的一端称为队头。队列的特点是先进先出,后进后出,所以队列也称先进先出表。
二、顺序队列
与堆栈类似,队列最简单的表示方式是采用一维数组,设数组为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)!!