#include<iostream>
using namespace std;
#define TOTAL_SPACE 5
typedef struct CircleIntQueue{
int data[TOTAL_SPACE];
int front;
int rear;
}*CircleIntQueuePtr;
CircleIntQueuePtr initQueue(){
CircleIntQueuePtr resultPtr=(CircleIntQueuePtr)malloc(sizeof(CircleIntQueue));
resultPtr->front=resultPtr->rear=0;
return resultPtr;
}
void enqueue(CircleIntQueuePtr paraPtr,int paraValue){
printf("Enqueue: %d ",paraValue);
if((paraPtr->rear+1)%TOTAL_SPACE==paraPtr->front){
printf("Queue full.\r\n");
return;
}
paraPtr->data[paraPtr->rear]=paraValue;
paraPtr->rear=(paraPtr->rear+1)%TOTAL_SPACE;
}
int dequeue(CircleIntQueuePtr paraPtr){
int resultValue;
if(paraPtr->front==paraPtr->rear) {
printf("No element in the queue.\r\n");
return -1;
}
resultValue=paraPtr->data[paraPtr->front];
paraPtr->front=(paraPtr->front+1)%TOTAL_SPACE;
return resultValue;
}
void outputCircleIntQueue(CircleIntQueuePtr paraPtr){
int i;
if (paraPtr->front== paraPtr->rear){
printf("Empty queue.");
return;
}
printf("Elements in the queue: ");
for (i=paraPtr->front;i!=paraPtr->rear;i=(i + 1)%TOTAL_SPACE) {
printf("data[%d] = %d, ",i,paraPtr->data[i]);
}
printf("\r\n");
}
void testCircleIntQueue(){
int i=10;
CircleIntQueuePtr tempPtr=initQueue();
for (;i<16;i++){
enqueue(tempPtr, i);
}
outputCircleIntQueue(tempPtr);
for (i=0; i<6;i++){
printf("dequeue gets %d\r\n",dequeue(tempPtr));
}
for(i=3; i<6;i++){
enqueue(tempPtr,i);
}
for(i=20;i<30;i++){
enqueue(tempPtr,i);
printf("dequeue gets %d\r\n",dequeue(tempPtr));
outputCircleIntQueue(tempPtr);
}
}
int main(){
testCircleIntQueue();
return 0;
}
在这段代码中,首先定义了循环队列的结构体CircleIntQueue,包括一个整型数组data用于存储数据,以及front和rear两个指针分别指向队列的头部和尾部。通过initQueue函数初始化队列,并实现了enqueue和dequeue两个操作分别用于入队和出队。enqueue函数将元素插入队尾,dequeue函数从队头取出元素。另外,还有一个outputCircleIntQueue函数用于打印队列中的元素,以及一个testCircleIntQueue函数用于测试队列的功能。
从代码中可以看出,循环队列的操作是基于取模运算实现循环利用数组空间的。在测试函数中,对队列进行了多次入队和出队操作,并输出了操作的结果。通过这些操作,可以看到循环队列的基本功能和特点。
学习心得: 通过阅读和理解这段代码,我对循环队列的实现有了更深入的了解。循环队列是一种高效的队列实现方式,能够充分利用数组空间,避免了普通队列在出队操作后需要频繁搬移元素的缺点。在实际应用中,循环队列常用于需要固定大小存储空间的场景,如缓冲区、操作系统中的进程调度等。