如果希望循环顺序队列中的存储空间都能得到利用,可设置一个标志域变量tag,并以tag的值为0或1来区分队头指针和队尾指针相等时的队列状态是“空”还是“满”。试编写此结构相应的入队和出队算法。
提示:满足上述要求的队列存储结构可描述如下:
typedef struct {
QElemType *base; //连续存储空间基址
int front; //队头指针,指向队首元素
int rear; //队尾指针,指向队尾元素的下一位置
int flag; // 标志域,初值为0,每当入队时,置值为1;每当出队时,置值为0;
}SqQueue;
//入队操作算法
Status EnQueue(SqQueue &Q, QElemType e) //设置一个标志变量的方法
// 在循环顺序队列Q中插入新的元素e, 使其成为新的队尾元素
{ if (Q.front==Q.rear&&Q.flag==1) //当前队满
{ printf("The Queue is OVERFLOW!\n");
return ERROR;
}
Q.base[Q.rear]=e; //e入队
Q.rear=(Q.rear+1)%MAXQSIZE; //队尾指针下移一位
Q.flag=1; //标志变量置为入队状态
return OK;
}//EnQueue
//出队操作算法
Status DeQueue (SqQueue &Q, QElemType &e) //设置一个标志变量的方法
// 删除循环顺序队列Q中的队首元素,并用e返回其值
{
if (Q.front==Q.rear&&Q.flag==0) //当前队空
{ printf("The Queue is NULL!\n");
return ERROR;
}
e=Q.base[Q.front]; //用e返 队首元素
Q.front=(Q.front+1)%MAXQSIZE; //队首指针下移一位
Q.flag=0; //标志变量置为出队状态
return OK;
} //DeQueue
标签:队尾,队列,C语言,入队,出队,front,rear
From: https://www.cnblogs.com/aal-izz-well-eureka/p/16890020.html