题目描述:
循环队列设置tag标志域判断队满队空
算法思想:
tag等于0的情况下,若因删除导致Q.Rear==Q.Front则为队空
tag等于1的情况下,若因插入导致Q.Rear==Q.Front则为队满
核心代码:
//tag等于0的情况下,若因删除导致Q.Rear==Q.Front则为队空
//tag等于1的情况下,若因插入导致Q.Rear==Q.Front则为队满
bool EnQueue(Queue &Q,int x)//,int tag)
{
//if((Q.Rear%MaxSize==Q.Front)&&tag==1)
//这里不需要再%MaxSize
if((Q.Rear==Q.Front)&&tag==1)
return false;
Q.data[Rear]=x;
Q.Rear=(Q.Rear+1)%MaxSize;
Q.tag=1;//可能队满
//这里其实挺有意思的,只有当同时满足Q.Rear==Q.Front)&&tag==1的时候才会return false
//只要你入队了,你就有可能队满
// if(Q.Rear==Q.Front)
// tag=1;
return true;
}
bool DeQueue(Queue &Q,int &x)//,int tag)
{
if(Q.Rear==Q.Front&&tag==0)
return false;
x=Q.data[Front];
Front=(Front+1)%MaxSize;
Q.tag=0;//可能队空
//只要你出队了,你就有可能队空
return true;
}