- 前言
- 一、基本操作
- 1.结构体
- 2、初始化
- 3、进队
- 4、出队
- 5、遍历
- 二、完整代码
前言
循环队列使用的是数组,但是这个数组比较特别,为循环数组。数组大小先固定,普通的数组的一个空间用了清空之后便无法使用,造成空间的浪费。所以,我们通过循环的方式来实现空间的再使用,很大程度上节省了空间的开销。循环队列结构图:
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("队列已满! 无法进队!rn");
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("队列为空!无法删除!rn");
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;itail;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#include #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("队列已满! 无法进队!rn"); 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("队列为空!无法删除!rn"); 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 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("rn"); for(i=0;i<5;i++) { printf("dequeue gets %drn",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



