循环队列队满的判断

第一种方法是设置一个标志量flag,当front==rear且flag=0时为空,当front==rear且flag=1时队列为满;

第二种方法是我们修改条件,保留一个元素空间,也就是说,数组中还有一个空闲单元时,我们就认为这个队列已经满了。

接下来我们重点讨论第二种方法,由于rear可能比front大,也可能是比front小,所以尽管他们只相差一个位置时候就是满的情况,但是也可能说是相差整整一圈。所以若队列最大尺寸为QueueSize,那么队列满的条件就是(rear+1)%QueueSize==front(这里取模“%”目的就是为了整合rear与front大小为一个问题)。比如图一所示,QueueSize=5,front=0,rear=4,根据公式(4+1)%5=0,所以此时队列满。
这里写图片描述
图一

通用计算队列长度公式:
(rear-front+QueueSize)%QueueSize

/*循环队列求长度代码,返回Q元素个数*/
 int QueueLength()
 {
    return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
 } 
/*循环队列求长度代码,返回Q元素个数*/
int QueueLength()
 {
    return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
 } 

 /*循环队列的入队列操作,若队列未满则插入元素e为Q新的队尾元素*/
Status EnQueue(SqQueue *Q,QElemType e)
  {
    if((Q->rear+1)%MAXSIZE==Q->front)/*队列满判断*/
        return ERROR;
    Q-date[Q->rear]=e;              /*将元素e赋值给队尾*/ 
    Q-rear=(Q->rear+1)%MAXSIZE;     
            /*rear指针向后移一位置,若到最后则转到数组头部*/

    return OK;   
  }

  /*循环队列的出队列操作,若队列不空,则删除Q中队头元素,用e返回其值*/
Status DeQueue(SqQueue *Q,QElemType e)
{
    if(Q->front==Q->rear)           /*队列空判断*/
        return ERROR;
    *e=Q->data[Q->front];           /*将队头元素赋值给e*/ 
    Q->front=(Q->front+1)%MAXSIZE;  
           /*front指针向后移一位置,若到最后则转到数组头部*/
    return OK
} 
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页