循环队列的长度「In DataStructure」
看循环队列计算长度公式时对距离的感觉有点模糊,又联想到每次计算两个索引之间的距离都在纠结相减是否要加1。所以写篇博客,以图形角度表现一下两个索引相减的含义,帮助以后计算索引相关问题时不再纠结。
两个索引相减得到的是什么?
对于索引n,如果直接把n减0得到的值是n-0=n,因此我们说索引n与索引0之间有n个值。如下图所示:

推广到数组中间,索引i减去索引j( i>j )得到的值是i-j=i-j,因此我们说索引i到索引j之间有i-j个值。如下图所示:


那么由两个图像的表现可以得到两个索引相减的图形含义:
索引减索引=包含两端索引在内的片段减去尾巴!
验证循环队列的长度公式
规定循环数组头指针指向头元素,尾指针指向尾元素的下一个节点。
那么公式为:(rear - front + QueueSize)% QueueSize 。验证如下:
1.当尾指针索引大于头指针索引
已上图为例,假设头指针为2,尾指针为5。
因此队列长度可以写成 rear - front。
那么公式递推:
rear - front
= (rear - front) % QueueSize <——(rear-front)永远小于队列长度,因此取余还是为原值
= (rear - front) % QueueSize + (QueueSize % QueueSize) <——数对自身取余结果为0
= (rear - front + QueueSize) % QueueSize <——合并
验证成立。
2.当尾指针索引大于头指针索引
见图可得:
rear - front
= - (front - rear)
= 红色线段长度的负数
因此
rear - front + QueueSize
= QueueSize - (front - rear)
= 橙色线段长度
= 队列长度
又 rear - front + QueueSize 小于 QueueSize
所以也可以写成 (rear - front + QueueSize) % QueueSize
所以不管尾指针索引是否大于头指针索引时公式都成立的。
其他情况
第二种队列情况:
头指针指向头元素的前一个节点,尾指针指向尾元素。公式依然成立。
第三种队列情况:
头指针指向头元素,尾指针指向尾元素。公式变为 (rear - front + 1 + QueueSize) % QueueSize
可以自行验证。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构