前言
循环队列使用的是数组,但是这个数组比较特别,为循环数组。数组大小先固定,普通的数组的一个空间用了清空之后便无法使用,造成空间的浪费。所以,我们通过循环的方式来实现空间的再使用,很大程度上节省了空间的开销。循环队列结构图:
一、基本操作
1.结构体
typedef struct CircleQueue
{
int data[TOTAL_SPACE];
int head;
int tail;
}*CircleQueueptr;
2、初始化
CircleQueueptr initQueue()
{
CircleQueueptr resultptr=(CircleQueueptr)malloc(sizeof(struct CircleQueue));
resultptr->head=0;
resultptr->tail=0;
return resultptr;
}
3、进队
在此需要知道的是,数组最后一个空间并没有存入元素。
void equeue(CircleQueueptr paraptr,int pValue)
{
if((paraptr->tail+1)%TOTAL_SPACE==paraptr->head)
{
printf("队列已满! 无法进队!\r\n");
return;
}
paraptr->data[paraptr->tail]=pValue;
paraptr->tail=(paraptr->tail+1)%TOTAL_SPACE;;
}
4、出队
int dequeue(CircleQueueptr paraptr)
{
int resultValue;
if(paraptr->head==paraptr->tail)
{
printf("队列为空!无法删除!\r\n");
return -1;
}
resultValue=paraptr->data[paraptr->head];
paraptr->head=(paraptr->head+1)%TOTAL_SPACE;
return resultValue;
}
5、遍历
void printQueue(CircleQueueptr paraptr)
{
int i;
if(paraptr->head==paraptr->tail)
{
printf("队列为空!");
return;
}
printf("该队列为:");
i=paraptr->head;
// for(i=paraptr->head;i<paraptr->tail;i++)
// {
// printf("%d ",paraptr->data[i%TOTAL_SPACE]);
// }
while(i!=paraptr->tail)
{
printf("%d ",paraptr->data[i%TOTAL_SPACE]);
i=(i+1)%TOTAL_SPACE;
}
}
二、完整代码
#include<stdio.h>
#include<malloc.h>
#define TOTAL_SPACE 5
typedef struct CircleQueue
{
int data[TOTAL_SPACE];
int head;
int tail;
}*CircleQueueptr;
CircleQueueptr initQueue()
{
CircleQueueptr resultptr=(CircleQueueptr)malloc(sizeof(struct CircleQueue));
resultptr->head=0;
resultptr->tail=0;
return resultptr;
}
void equeue(CircleQueueptr paraptr,int pValue)
{
if((paraptr->tail+1)%TOTAL_SPACE==paraptr->head)
{
printf("队列已满! 无法进队!\r\n");
return;
}
paraptr->data[paraptr->tail]=pValue;
paraptr->tail=(paraptr->tail+1)%TOTAL_SPACE;;
}
int dequeue(CircleQueueptr paraptr)
{
int resultValue;
if(paraptr->head==paraptr->tail)
{
printf("队列为空!无法删除!\r\n");
return -1;
}
resultValue=paraptr->data[paraptr->head];
paraptr->head=(paraptr->head+1)%TOTAL_SPACE;
return resultValue;
}
void printQueue(CircleQueueptr 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]);
}
}
void test()
{
int i;
CircleQueueptr tempptr=initQueue();
for(i=10;i<15;i++)
{
equeue(tempptr,i);
}
printQueue(tempptr);
printf("\r\n");
for(i=0;i<5;i++)
{
printf("dequeue gets %d\r\n",dequeue(tempptr));
}
}
int main()
{
test();
return 0;
}
运行结果:
队列已满! 无法进队!
该队列为:10 11 12 13
dequeue gets 10
dequeue gets 11
dequeue gets 12
dequeue gets 13
队列为空!无法删除!
dequeue gets -1