循环队列其实就是一个数组,是靠队头、队尾下标来实现头尾相接
代码展示
第一步,定义一个循环队列
typedef struct CircleIntQueue{
int data[TOTAL_SPACE];
int head;
int tail;
}*CircleIntQueuePtr;
第二步,初始化
CircleIntQueuePtr initQueue() {
CircleIntQueuePtr resultPtr = (CircleIntQueuePtr)malloc(sizeof(CircleIntQueuePtr));
resultPtr->head = 0;
resultPtr->tail = 0;
return resultPtr;
}
第三步,入队操作
// 入队
void enqueue(CircleIntQueuePtr paraPtr, int paraValue) {
// 判断队列是否已满
if ((paraPtr->tail + 1) % TOTAL_SPACE == paraPtr->head) {
printf("队列已满rn");
return;
}
paraPtr->data[paraPtr->tail % TOTAL_SPACE] = paraValue;
paraPtr->tail++;
}
第四步,出队
// 出队
int dequeue(CircleIntQueuePtr paraPtr) {
int resultValue;
if (paraPtr->head == paraPtr->tail) {
printf("没有元素在队列中rn");
return -1;
}
resultValue = paraPtr->data[paraPtr->head % TOTAL_SPACE];
paraPtr->head++;
return resultValue;
}
第五步,打印工作
void outputLinkQueue(CircleIntQueuePtr paraPtr){
int i;
if (paraPtr->head == paraPtr->tail) {
printf("队列为空");
return;
}
printf("元素在队列中:");
for (i = paraPtr->head; i < paraPtr->tail; i++) {
printf("%d, ", paraPtr->data[i % TOTAL_SPACE]);
}
printf("rn");
}
第六步,测试
void testLinkQueue(){
int i = 10;
CircleIntQueuePtr tempPtr = initQueue();
for (; i < 16; i ++) {
enqueue(tempPtr, i);
}
outputLinkQueue(tempPtr);
for (i = 0; i < 6; i ++) {
printf("元素地址为:%d 出列得到 %drn",i,dequeue(tempPtr));
}
enqueue(tempPtr, 8);
outputLinkQueue(tempPtr);
}
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作,和栈一样,队列是一种操作受限制的线性表。



