顾名思义,循环队列是一种队列。
循环队列常用于服务器用户排队等待情况。
循环队列具有头指针f和尾指针r,头指针f指向队列中实际存在的第一个值,r指向队列中实际存在的最后一个值的下一个位置。
为什么要指向下一个位置?
我们先假设尾指针r指向队列中实际存在的最后一个值。
f为首,r为尾
push:r=(r+1)%n
pop:f=(f+1)%n
什么时候队列为空呢?删完了不就为空了,那么我们让f开始删除,每删除一个节点,f向后移动。
循环删除后f的位置:f=(f+1)%n。(n为队列大小)
这种情况仅剩一个元素,f=r,再删除一个元素队列即为空。
此时队列为空,可以看出,为空时(r+1)%n=f
那什么时候为满呢?
我们用同样的思维可以得到满时的情况。
此时为满,(r+1)%n=f
发现了吗,队满和对空竟然是一样的,那这样就没法判断什么时候是空还是满了。
这次我们空出一块地方,把r指向实际存在的最后一个值的下一个位置。
这时,r指向实际存在的元素的下一个位置。
那么聪明的你就发现了,这样做以后空和满的判断就不冲突了
empty:r=f
full:(r+1)%n=f
另一种判断队列满还是空的方法:
可以用一个变量index来计数,如果index=n泽满,index=0为空。此时r不需要指向后一个元素。
来源:CSDN
作者:shelven丶
链接:https://blog.csdn.net/qq_43461641/article/details/103705652