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));
	
 } 

运行结果:

C语言循环队列&初始化&入队&出队&判队满&判队空&求队列元素个数&求队列长度