循环队列就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。在循环队列结构中,当存储空间的最后一个位置已被使用而再要进入队运算时,只需要存储空间的第一个位置空闲,便可将元素加入到第一个位置,即将存储空间的第一个位置作为队尾。
为了区别这空和满时都有head=tail,规定循环队列最多只能有MaxSize-1个队列元素,当循环队列中只剩下一个空存储单元时,队列就已经满了。因此,队列判空的条件是head=tail,而队列判满的条件是head=(tail+1)%MaxSize。
完整代码
#include <stdio.h>
#include <malloc.h>
#define MAXSIZE 5
typedef struct CircleIntQueue{
int data[MAXSIZE];
int head;
int tail;
}*CircleIntQueuePtr;
CircleIntQueuePtr iniQueue(){
CircleIntQueuePtr result = (CircleIntQueuePtr)malloc(sizeof(struct CircleIntQueue));
result->head = 0;
result->tail = 0;
return result;
}
void enqueue(CircleIntQueuePtr pPtr,int pValue){
if((pPtr->tail + 1) % MAXSIZE == pPtr->head){
printf("Queue full.\n");
return;
}
pPtr->data[pPtr->tail % MAXSIZE] = pValue;
pPtr->tail++;
}
int dequeue(CircleIntQueuePtr pPtr){
int result;
if(pPtr->head == pPtr->tail){
printf("No element in the queue.\n");
return 0;
}
result = pPtr->data[pPtr->head % MAXSIZE];
pPtr->head++;
return result;
}
void printCircleQueue(CircleIntQueuePtr pPtr){
int i;
if(pPtr->head == pPtr->tail){
printf("Empty queue.");
return;
}
printf("Element in the queue:");
for(i = pPtr->head;i < pPtr->tail;i ++){
printf("%d,",pPtr->data[i % MAXSIZE]);
}
printf("\n");
}
void testCircleQueue(){
int i = 10;
CircleIntQueuePtr temp = iniQueue();
for(;i < 16; i++){
enqueue(temp,i);
}
printCircleQueue(temp);
for(i = 0;i < 6;i ++){
printf("dequeue gets %d\n",dequeue(temp));
}
enqueue(temp,8);
printCircleQueue(temp);
}
int main(){
testCircleQueue();
return 0;
}
运行结果
Queue full.
Queue full.
Element in the queue:10,11,12,13,
dequeue gets 10
dequeue gets 11
dequeue gets 12
dequeue gets 13
No element in the queue.
dequeue gets 0
No element in the queue.
dequeue gets 0
Element in the queue:8,