C语言循环队列的表示与实现实例详解
1.概述:
C语言的队列(queue),是先进先出(FIFO,First-In-First-Out)的线性表数据结构。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作。
循环队列可以更简单的防止伪溢出的发生,但是队列大小是固定的。
2.实例代码:
/*队列的顺序存储结构(循环队列)*/
#defineMAX_QSIZE5/*最大队列长度+1*/
typedefstruct
{
QElemType*base;/*初始化的动态分配存储空间*/
intfront;/*头指针,若队列不空,指向队列头元素*/
intrear;/*尾指针,若队列不空,指向队列尾元素的下一个位置*/
}SqQueue;
/*循环队列的基本操作(9个)*/
voidInitQueue(SqQueue*Q)
{/*构造一个空队列Q*/
Q->base=malloc(MAX_QSIZE*sizeof(QElemType));
if(!Q->base)/*存储分配失败*/
exit(OVERFLOW);
Q->front=Q->rear=0;
}
voidDestroyQueue(SqQueue*Q)
{/*销毁队列Q,Q不再存在*/
if(Q->base)
free(Q->base);
Q->base=NULL;
Q->front=Q->rear=0;
}
voidClearQueue(SqQueue*Q)
{/*将Q清为空队列*/
Q->front=Q->rear=0;
}
StatusQueueEmpty(SqQueueQ)
{/*若队列Q为空队列,则返回TRUE;否则返回FALSE*/
if(Q.front==Q.rear)/*队列空的标志*/
returnTRUE;
else
returnFALSE;
}
intQueueLength(SqQueueQ)
{/*返回Q的元素个数,即队列的长度*/
return(Q.rear-Q.front+MAX_QSIZE)%MAX_QSIZE;
}
StatusGetHead(SqQueueQ,QElemType*e)
{/*若队列不空,则用e返回Q的队头元素,并返回OK;否则返回ERROR*/
if(Q.front==Q.rear)/*队列空*/
returnERROR;
*e=Q.base[Q.front];
returnOK;
}
StatusEnQueue(SqQueue*Q,QElemTypee)
{/*插入元素e为Q的新的队尾元素*/
if((Q->rear+1)%MAX_QSIZE==Q->front)/*队列满*/
returnERROR;
Q->base[Q->rear]=e;
Q->rear=(Q->rear+1)%MAX_QSIZE;
returnOK;
}
StatusDeQueue(SqQueue*Q,QElemType*e)
{/*若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR*/
if(Q->front==Q->rear)/*队列空*/
returnERROR;
*e=Q->base[Q->front];
Q->front=(Q->front+1)%MAX_QSIZE;
returnOK;
}
voidQueueTraverse(SqQueueQ,void(*vi)(QElemType))
{/*从队头到队尾依次对队列Q中每个元素调用函数vi()*/
inti;
i=Q.front;
while(i!=Q.rear)
{
vi(Q.base[i]);
i=(i+1)%MAX_QSIZE;
}
printf("\n");
}