版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
3 篇文章0 订阅
订阅专栏
第一种方法是设置一个标志量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 }
收藏
一键三连
扫一扫,分享海报
专栏目录
少一个存储位置的 队列为空时:rear= =front 队列满时:(rear+1)%maxSize= =front 不少一个存储位置时:加一个标志flag或者计数的count 入队时flag=true 出队时flag=false 队满:rear= =front&flag 队空:rear= =front&!flag 开始时count=0 入队时:count++ 出队是:count– 队满:rear ==front &&count=maxsize 队空:rear ==front