一、循环队列结构体
typedef int QueueDataType;
#define CQ_MAX_SIZE 10typedef 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);
}
运行结果: