循环数组队列的实现

/*
*	循环数组队列的实现
*/

#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 10 //最大可存数据量为 MAX_SIZE - 1 
#define ElementType int

typedef struct {
	ElementType data[MAX_SIZE];
	int rear; //最后元素的位置 
	int front;//最前元素的位置的前一个位置 
}Queue;

const ElementType error = 0;
int ERROR = 0;//0 无错误,1有错误 

/*
*	创建一个空队列 
*/
Queue * CreateQueue() {
	Queue * queue = (Queue *)malloc(sizeof(Queue));
	queue->rear = -1;
	queue->front = -1;
	return queue;
}

/**
*	判断队列是否为空
*	返回:1空 0非空 
*/
int IsFull(Queue * q) {
	//(q->rear + 1)%MAX_SIZE
	//若q到了数组的最后一位,(q->rear + 1)%MAX_SIZE = 0 
	//若q还没到达数组的最后一位,这里的结果还是 q->rear + 1
	//所以这个语句是为了解决循环问题 
	return (q->rear + 1)%MAX_SIZE == q->front;
}

/**
*	判断队列是否已满 
*	返回:1空 0非空 
*/
int IsEmpty(Queue * q) {
	return q->front == q->rear;
}

/**
*	返回队列长度 
*/ 
int Length(Queue * q) {
	int front = q->front;
	int rear = q->rear;
	int len = 0;
	while (front != rear) {
		front = (front + 1) % MAX_SIZE;
		len ++;
	}
	return len;
}

/**
*	添加元素到队列
*	调用后,若队列已满 EEOR = 1 
*/
void Add(ElementType x, Queue * q) {
	
	ERROR = 0;
	if (IsFull(q)) {
		printf("队列已满\n");
		ERROR = 1;
		return;	
	}
	q->rear = (q->rear + 1)%MAX_SIZE;
	q->data[q->rear]  = x;
}

/**
*	从队列中删除元素 
*	调用后,若队列为空 EEOR = 1
*	返回:被删除的元素 
*/
ElementType Delete(Queue * q) {
	
	ERROR = 0;
	if (IsEmpty(q)) {
		printf("队列已空");
		ERROR = 1;
		return error;
	}
	q->front = (q->front + 1) % MAX_SIZE;
	return q->data[q->front];
}

/**
*	打印队列信息 
*/
void Print(Queue * q) {
	int front = q->front;
	int rear = q->rear;
	printf("队列的长度是:%d\n",Length(q));
	printf("队列内容是: ");
	while (front != rear) {
		front = (front + 1) % MAX_SIZE;
		printf("%d ",q->data[front]);
	}
	printf("\n");
}


int main() {
	
	Queue * q = CreateQueue();
	Add(10,q);
	Add(11,q);
	Add(12,q);
	Add(13,q);
	Add(14,q);
	Print(q);
	
	printf("删除的是:%d\n",Delete(q)); 
	printf("删除的是:%d\n",Delete(q));
	Print(q);
	
	Add(15,q);
	Add(16,q);
	Add(17,q);
	Add(18,q);
	Add(19,q);
	Add(20,q);
	Add(21,q);
	Add(22,q);
	Add(23,q);
	Print(q);
	
	printf("删除的是:%d\n",Delete(q)); 
	printf("删除的是:%d\n",Delete(q));
	Print(q);
	
	printf("删除的是:%d\n",Delete(q)); 
	printf("删除的是:%d\n",Delete(q));
	Print(q);
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值