循环队列的三种处理方式
为了实现队列中元素的顺序存储,避免出现假溢出的现象,我们采用了循环队列,但是为了区分队空还是队满,我们有三种处理方式。
1.牺牲一个单元来区分队空还是队满,入队时少用一个队列单元,这是一种非常普遍的方法。
队满的条件:(Q.rear+1)%Maxsize==Q.front;
队空的条件: Q.front=Q.rear;
队列中的元素:(Q.rear+Maxsize-Q.front)%Maxsize.
(1)初始化
下面展示一些 内联代码片
。
void InItQueue(SqQueue &Q){
Q.front=Q.rear=0; //初始化队首、队尾指针
}
(2)判断队空
void isEmpty(SqQueue &Q){
if(Q.front=Q.rear)
return true;
else
return false;
}
(3)入队
bool EnQueue(SqQueue &Q,ElemType x){
if((Q.rear+1)%Maxsize==Q.front)
return false;
Q.data[Q.rear]=x;
Q.rear=(Q.rear+1)%Maxsize;
return true;
}
(4)出队
bool DeQueue(SqQueue &Q,ElemType &x){
if(Q.front=Q.rear)
return false;
x=Q.data[Q.front];
Q.front=(Q.front+1)%Maxsize;
return true;
}
2.类型中增设表示元素个数的数据成员,这样的话,队空的条件也就变成了Q.size==0,队满的条件 Q.size=Maxsize。其实这两种情况都有Q.front=Q.rear。这里只对于出队、入队进行一下简单的描写。
(1)入队
bool EnQueue(SqQueue &Q,ElemType x){
if(Q.size=Maxsize)
return false;
Q.data[Q.rear]=x;
Q.rear=(Q.rear+1)%Maxsize;
Q.size++;
return true;
}
(2)出队
bool DeQueue(SqQueue &Q,ElemType &x){
if(Q.size=0)
return false;
x=Q.data[Q.front];
Q.front=(Q.front+1)%Maxsize;
Q.size--;
return true;
}
3.类型中增设tag数据成员,用以区分队满还是队空。当tag等于0的时候,如果因删除还导致的Q.front= =Q.rear,则为队空;当tag等于1的时候,如果因为插入而导致的Q.front==Q.rear ,则为队满。
(1)入队
bool EnQueue(SqQueue &Q,ElemType x){
if(Q.tag==1&&Q.front=Q.rear)
return false;
Q.data[Q.rear]=x;
Q.rear=(Q.rear+1)%Maxsize;
tag=1;
return true;
}
(2)出队
bool DeQueue(SqQueue &Q,ElemType &x){
if(Q.tag==0&&Q.front=Q.rear)
return false;
x=Q.data[Q.front];
Q.front=(Q.front+1)%Maxsize;
tag=0;
return true;
}