循环队列是由数组来实现的,也是先进先出的规则。通过头脚标和尾脚标来实现对数据的删除和插入。在循环时为了区分队列是队满还是队空,我这里采用的是浪费一个空间使得尾脚标永远追不上头脚标指向的值,当尾脚标与头脚标中间只差一个空间判断为满,当头脚标追上头脚标的时队空。
代码实现,具体理解请跟着代码画图。
#include#include #define Max 5 typedef struct CircleIntQueue{ int data[Max]; int front; int rear; }*CircleIntQueuePtr; CircleIntQueuePtr initqueue(){ CircleIntQueuePtr tempqueue = (CircleIntQueuePtr)malloc(sizeof(CircleIntQueue)); tempqueue->front = 0; tempqueue->rear = 0; return tempqueue; } void enqueue(CircleIntQueuePtr paraPtr, int paraValue){ if((paraPtr->rear+1)%Max==(paraPtr->front)%Max){ printf("队已满n"); return; } paraPtr->data[(paraPtr->rear)%Max] = paraValue; paraPtr->rear ++; } int dequeue(CircleIntQueuePtr paraPtr){ int resultValue; if(paraPtr->front == paraPtr->rear){ printf("队为空n"); return -1; } resultValue = paraPtr->data[paraPtr->front%Max]; paraPtr->front ++; return resultValue; } void outputLinkQueue(CircleIntQueuePtr paraPtr){ int i ; if(paraPtr->front == paraPtr->rear){ printf("队为空n"); return; } printf("队列中数据为:"); for(i = paraPtr->front;i<=paraPtr->rear-1;i++){ printf("%d ",paraPtr->data[i%Max]); } printf("n"); } void testLinkQueue(){ int i = 10; CircleIntQueuePtr tempPtr = initqueue(); for (; i < 16; i ++) { enqueue(tempPtr, i); } outputLinkQueue(tempPtr); for (i = 0; i < 6; i ++) { printf("dequeue gets %drn", dequeue(tempPtr)); } enqueue(tempPtr, 8); enqueue(tempPtr, 9); outputLinkQueue(tempPtr); printf("dequeue gets %drn", dequeue(tempPtr)); printf("dequeue gets %drn", dequeue(tempPtr)); printf("dequeue gets %drn", dequeue(tempPtr)); enqueue(tempPtr, 20); enqueue(tempPtr, 20); enqueue(tempPtr, 20); enqueue(tempPtr, 20); enqueue(tempPtr, 20); outputLinkQueue(tempPtr); } int main(){ testLinkQueue(); return 1; }
运行结果



