C语言 顺序队列及循环队列的基本操作


一、队列的定义

队列是一种运算受限制的线性表,它与堆栈的不同之处在于元素的添加在表的一端进行,而元素的删除在另一端进行。允许添加元素的一端称为队尾,允许删除元素的一端称为队头。队列的特点是先进先出,后进后出,所以队列也称先进先出表。

二、顺序队列

与堆栈类似,队列最简单的表示方式是采用一维数组,设数组为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)!!

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM