假设将循环队列定义为:以域变量rear和length分别指示循环队列中队尾元素的位置和内含元素的个数。试给出此循环队列的队满条件,并写出相应的入队列和出队列的算法。
循环队列CLenQueue的类型定义如下:
循环队列CLenQueue的类型定义如下:
typedef char QElemType;
typedef struct {
QElemType elem[MAXQSIZE];
int length;
int rear;
} CLenQueue;
实现函数如下:
Status EnCQueue(CLenQueue &Q, QElemType x)
{
if(Q.length == MAXQSIZE){
return ERROR;//循环队列满
}
if(MAXQSIZE - 1 != Q.rear){
++Q.rear;
Q.elem[Q.rear] = x;
}
else{//rear指向循环队列的末尾时,作特殊处理使其构成循环
Q.rear = 0;
Q.elem[Q.rear] = x;
}
++Q.length;//当前元素个数+1
return OK;
}
Status DeCQueue(CLenQueue &Q, QElemType &x)
{
if(!Q.length){
return ERROR;//循环队列空
}
if(Q.rear + 1 >= Q.length){//当rear的下标大于对头指向的下标时
x = Q.elem[Q.rear + 1 - Q.length];
}
else{//当rear的下标小于队头下标时
x = Q.elem[MAXQSIZE + Q.rear + 1 - Q.length];
}
--Q.length;//当前元素个数-1
return OK;
}