循环队列c语言版
一、循环队列结构体
typedef int QueueDataType;
#define CQ_MAX_SIZE 10
typedef struct CircularQueue
{
QueueDataType data[CQ_MAX_SIZE];
/**标记队列首*/
QueueDataType head;
/**标记队列尾部*/
QueueDataType rear;
} CircularQueue;
二、循环队列操作函数声明
/**创建队列*/
CircularQueue* create_circular_queue();
/**队列是否已满*/
bool isFull(CircularQueue* queue);
/**队列是否为空*/
bool isEmpty(CircularQueue* queue);
/**入队列*/
bool enqueue(CircularQueue* queue,QueueDataType el);
/**出队列*/
QueueDataType dequeue(CircularQueue* queue);
/**输出队列*/
void show_queue(CircularQueue* queue);
/**销毁队列*/
void destory_queue(CircularQueue* queue);
三、循环队列操作函数定义
/**创建队列*/
CircularQueue* create_circular_queue()
{
CircularQueue* queue = (CircularQueue*) malloc(sizeof(CircularQueue));
if(queue == NULL)
{
perror("CircularQueue分配内存空间失败");
return NULL;
}
queue->head = 0;
queue->rear = 0;
return queue;
}
/**队列是否为空*/
bool isEmpty(CircularQueue* queue)
{
return queue->head == queue->rear;
}
/**队列是否已满*/
bool isFull(CircularQueue* queue)
{
// rear是冗余出来的一个空间,置于队尾,用于记当前队中元素的个数
return (queue->rear + 1)%CQ_MAX_SIZE == queue->head;
}
/**入队列*/
bool enqueue(CircularQueue* queue,QueueDataType el)
{
if(isFull(queue))
{
perror("队列已满");
return false;
}
queue->data[queue->rear%CQ_MAX_SIZE] = el ;
queue->rear++;
return true;
}
/**出队列*/
QueueDataType dequeue(CircularQueue* queue)
{
if(isEmpty(queue))
{
perror("对列中暂无元素");
return -1;
}
QueueDataType el = queue->data[queue->head%CQ_MAX_SIZE];
queue->head++;
return el;
}
/**输出队列*/
void show_queue(CircularQueue* queue)
{
if(isEmpty(queue))
{
perror("对列中暂无元素");
return ;
}
int i = queue->head;
while ( i < queue->rear)
{
QueueDataType el = queue->data[i%CQ_MAX_SIZE];
printf("el=%d\n",el);
i++;
}
}
void destory_queue(CircularQueue* queue)
{
free(queue);
}
四、测试队列
void test_cricular_queue()
{
CircularQueue *quque = create_circular_queue();
QueueDataType arr[] = {11,21,31,41,51,61,71,81,91,101};
int i = 0;
for(;i<10;i++)
{
enqueue(quque,arr[i]);
}
show_queue(quque);
QueueDataType el = dequeue(quque);
printf("取出队列元素el=%d\n",el);
destory_queue(quque);
}
运行结果: