/*
* 循环数组队列的实现
*/
#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;
}
循环数组队列的实现
最新推荐文章于 2022-09-21 14:50:30 发布