代码:
#include<stdio.h>
#include<malloc.h>
#define TOTAL_SPACE 5
/**
* 循环队列
*/
typedef struct CircleIntQueue{
int data[TOTAL_SPACE];
int front;
int rear;
} *CircleIntQueuePtr;
/**
* 初始化队列
*/
CircleIntQueuePtr initQueue(){
CircleIntQueuePtr resultPtr = (CircleIntQueuePtr)malloc(sizeof(struct CircleIntQueue));
resultPtr->front = 0;
resultPtr->rear = 0;
return resultPtr;
} // of the first constructor
/**
* 在循环队列中加入元素
*/
void enqueue(CircleIntQueuePtr paraPtr, int paraValue){
printf("Enqueue: %d ", paraValue);
if((paraPtr->rear + 1) % TOTAL_SPACE == paraPtr->front){
printf("Queue full.\r\n");
return;
} //of if
paraPtr->data[paraPtr->rear] = paraValue;
paraPtr->rear = (paraPtr->rear + 1) % TOTAL_SPACE;
} //of enqueue
/**
* 删除元素
*/
int dequeue(CircleIntQueuePtr paraPtr){
int resultValue;
if(paraPtr->front == paraPtr->rear){
printf("No element in the queue.\r\n");
return -1;
}//of if
resultValue = paraPtr->data[paraPtr->front];
paraPtr->front = (paraPtr->front + 1) % TOTAL_SPACE;
return resultValue;
} // of dequeue
/**
*输出队列
*/
void outputCircleIntQueue(CircleIntQueuePtr paraPtr){
int i;
if(paraPtr->front == paraPtr->rear){
printf("Empty queue.");
return;
}//of if
printf("Elemets in the queue: ");
for (i = paraPtr->front; i != paraPtr->rear; i = (i + 1) % TOTAL_SPACE){
printf("data[%d] = %d, ", i, paraPtr->data[i]);
}// of for i
printf("\r\n");
} // of outputCircleIntQueue
/**
* test
*/
void testCircleIntQueue(){
int i = 10;
CircleIntQueuePtr tempPtr = initQueue();
for(i; i < 16; i ++){
enqueue(tempPtr, i);
}// of for i
outputCircleIntQueue(tempPtr);
for(i = 0; i < 6; i ++){
printf("dequeue gets %d\r\n",dequeue(tempPtr));
}//of for i
for(i = 3; i < 6; i ++){
enqueue(tempPtr, i);
}//of for i
for(i = 20; i < 30; i ++){
enqueue(tempPtr, i);
printf("dequeue gets %d\r\n",dequeue(tempPtr));
outputCircleIntQueue(tempPtr);
}// of for i
} //of testCircleIntQueue
/**
* The entrance
*/
int main(){
testCircleIntQueue();
return 0;
} // of main
运行结果:
总结:
循环队列中指针和队列元素之间的关系不变,我们只需要利用模运算就可以很容易实现指针的循环移动。但是循环队列中存在一个问题,在循环队列中只凭头指针front等于尾指针rear无法判别队列空间是“空”还是“满”,所以在以上代码中,我们在移动rear的过程中来和front进行判断,如果二者的值是相同的,则说明该循环队列已经“满”了,不能再添加元素