习题3.12 另类循环队列 (20分)
1.题目要求
如果用一个循环数组表示队列,并且只设队列头指针Front,不设尾指针Rear,而是另设Count记录队列中元素个数。请编写算法实现队列的入队和出队操作。
函数接口定义:
bool AddQ( Queue Q, ElementType X );
ElementType DeleteQ( Queue Q );
2.理解
实现循环队列
队首:Q->Front=(Q->Front+1)%Q->MaxSize;
队尾:Q->Rear=(Q->Front+Q->Count)%Q->MaxSize;
删除操作:移动队首,计数器Count–;
插入操作:先执行计数器Count++,在执行向后移动队尾(这里也可以先移动队尾,后执行Count++,知识删除操作取出数的下标要变化);
注意:队首默认为0;
如下图所示:
3.代码
bool AddQ( Queue Q, ElementType X );
{
if(Q->Count>=Q->MaxSize){
printf("Queue Full\n");
return false;
}
Q->Count++;
Q->Data[(Q->Count+Q->Front)%Q->MaxSize]=X;
return true;
}
ElementType DeleteQ( Queue Q ){
if(Q->Count==0)
{
printf("Queue Empty\n");
return ERROR;
}
Q->Front=(Q->Front+1)%Q->MaxSize;
Q->Count--;
return Q->Data[Q->Front];
}