欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

静态数组实现循环队列 c语言

程序员文章站 2022-11-08 23:52:31
#include #include #define Data_Type int #define Queue_Len 5 //判断队满有两种方式,一种是加以个标记,比如说...
#include
#include
#define Data_Type int
#define Queue_Len 5
//判断队满有两种方式,一种是加以个标记,比如说size。 
//另一种是浪费一块空间,当占到N-1时,就算满。 
typedef struct Queue{
	Data_Type data[Queue_Len];
	int front;//队头元素的前一个元素 
	int rear;// 队尾元素 
	//int size; 记录队列的大小 
}QUEUE,* QQUEUE;

void create(QQUEUE); 
bool isFull(QQUEUE);
bool isEmpty(QQUEUE);
bool add(QQUEUE,Data_Type);
Data_Type out(QQUEUE);
void traverse(QQUEUE);

int main(void){
	QUEUE queue ;
	create(&queue);
	add(&queue,1);
	add(&queue,2);
	add(&queue,3);
	add(&queue,4);
	out(&queue);
	add(&queue,5);
	out(&queue);
	add(&queue,6);
	out(&queue);
	add(&queue,7);
	traverse(&queue);
	
}

bool isFull(QQUEUE qQuere){
	if((qQuere->rear+1)%Queue_Len==qQuere->front){
		return true;
	} else{
		return false;
	}
}

bool isEmpty(QQUEUE qQueue){
	if(qQueue->front==qQueue->rear){
		return true;
	}else{
		return false;
	}
}

void create(QQUEUE qQueue){
	qQueue->front=qQueue->rear=0;
	return;
}

void traverse(QQUEUE qQueue){
	int i=qQueue->front;	
	while(i!=qQueue->rear){
		//这里比较绕,为什么输出时要取余?
		//首先front表示的是队首元素的前一个元素,肯定是不能输出的。
		// 如果给他+1,则可以正常输出队首。
		//但队尾会出问题,如果下标是队尾下标,+1则会超出数组长度
		//所以再取余, 则输出正常 
		printf(%d
,qQueue->data[(i+1)%Queue_Len]);
		i++;
		i=i%Queue_Len;	
		
		
		//换一种好理解的
		//先找到下一个合法元素,找到再输出 
		//所以直接输出i 就可以了,因为i已经是要找的下一个元素。
		 
		//i++;
		//i=i%Queue_Len;	
		//printf(%d
,qQueue->data[i]);
	}
}

bool add(QQUEUE qQueue,Data_Type val){
	if(isFull(qQueue)){
		return false;
	}else{
		qQueue->rear = (qQueue->rear+1)%Queue_Len;
		qQueue->data[qQueue->rear]=val;
		return true; 
	}
}
Data_Type out(QQUEUE qQueue){
	if(isEmpty(qQueue)){
		exit(-1);
	}else{
		
		Data_Type val = qQueue->data[qQueue->front+1];
		qQueue->front = (qQueue->front+1)%Queue_Len; 
		return val;
	}
}