C语言循环队列&初始化&入队&出队&判队满&判队空&求队列元素个数&求队列长度
为了解决一般队列“假溢出”的问题,出现了循环队列,即最后一个元素的后继是第一个元素。
在循环队列中,我用的是少用一个元素空间的方法来区别队空和队满。
队空:q->front = q ->rear;队满:(q->rear+1)%MAXSIZE = q->front,具体代码如下:
#include <stdio.h>
#include <malloc.h>
#define MAXSIZE 10
typedef struct{
int data[MAXSIZE];
int front,rear;
}CSeQueue;
//队列的初始化
CSeQueue *Init_Queue(){
CSeQueue *q;
q = (CSeQueue *)malloc(sizeof(CSeQueue));
q->front = q->rear = 0;
return q;
}
//判队满
int Full_Queue(CSeQueue *q){
if((q ->rear + 1) % MAXSIZE == q ->front){
return 1;
}else
return 0;
}
//入队
int In_Queue(CSeQueue *q,int x){
if(Full_Queue(q)){
printf("队满");
return 0;
}
else{
q ->rear = (q ->rear + 1) % MAXSIZE;
q ->data[q ->rear] = x;
return 1;
}
}
// 判队空
int Empty_Queue(CSeQueue *q){
if(q ->front == q ->rear)
return 1;
else
return 0;
}
//出队
int Out_Queue(CSeQueue *q,int *x){
if(Empty_Queue(q)){
printf("队空");
return 0;
}else {
q ->front = (q ->front + 1) % MAXSIZE;
*x = q ->data[q ->front];
return 1;
}
}
//打印输出队列中的元素
void printf_Queue(CSeQueue *q){
int i = q ->front;
printf("队列中的元素是:");
while(i != q ->rear){
printf("%d ",q ->data[i+1]);
i ++;
i = i % MAXSIZE;
}
}
//求队列的长度
int Queue_Length(CSeQueue *q){
return(q->rear - q->front + MAXSIZE) % MAXSIZE;
}
int main(){
//队列初始化
CSeQueue *q;
q = Init_Queue();
//插入第一个元素
printf("将元素1插入到队尾后的结果:\n");
In_Queue(q,1);
printf_Queue(q);
printf("循环队列长度=%d\n",Queue_Length(q));
// 插入第二个元素
printf("将元素2插入到队尾后的结果:\n");
In_Queue(q,2);
printf_Queue(q);
printf("循环队列长度=%d\n",Queue_Length(q));
// 插入第三个元素
printf("将元素3插入到队尾后的结果:\n");
In_Queue(q,3);
printf_Queue(q);
printf("循环队列长度=%d\n",Queue_Length(q));
// 删除第一个元素
int a;
Out_Queue(q,&a);
printf("出队的元素是:%d\n",a);
printf_Queue(q);
printf("循环队列长度=%d\n",Queue_Length(q));
}
运行结果: