数组实现的循环队列rear_index计算式含义及入队应用逻辑咨询
循环队列 rear 索引计算公式逻辑及入队应用说明
首先明确数组实现循环队列的核心设计背景:
数组是固定长度的结构,容量arraySize一旦定义就不会动态变化。如果按照普通非循环队列的逻辑,入队时直接让rear_index +=1,当rear_index到达数组最大下标arraySize -1之后,再入队就会触发数组越界错误。但此时数组头部很可能因为之前的出队操作已经空出了可用位置,普通队列的实现会直接浪费这部分空间,循环队列就是为了解决这个问题,将数组从逻辑上模拟成首尾相接的环形结构。
公式运行逻辑拆解
你提到的公式rear_index = (rear_index + 1) % arraySize就是实现环形跳转的核心,拆分两部分理解:
rear_index + 1:和普通队列的逻辑完全一致,入队后尾部索引向后移动一位,指向新的可插入位置- 取模运算
% arraySize:是实现「循环」的关键,分两种情况生效:- 当
rear_index +1 < arraySize时,取模结果和rear_index +1完全相等,和普通队列行为没有差异 - 当
rear_index已经是数组最后一个下标arraySize-1时,rear_index +1 = arraySize,此时arraySize % arraySize = 0,尾部索引直接跳转到数组第一个下标0,实现了绕回数组头部的效果,刚好可以复用之前出队空出的头部空间
- 当
入队操作中的实际生效流程
完整的入队操作步骤如下,公式会在最后一步执行:
- 先执行队列满判断(避免新元素覆盖还未出队的有效数据,不同判满逻辑可以参考循环队列的标准实现)
- 将待入队的新元素写入数组中当前
rear_index指向的位置 - 执行
rear_index = (rear_index + 1) % arraySize更新尾部索引,指向下一个可插入的位置
实际示例
我们用容量为5的数组举例,数组下标范围为0~4,初始状态front = 0,rear_index = 0:
- 依次入队A、B、C、D、E,每次入队后
rear_index分别更新为1、2、3、4、(4+1)%5=0,此时队列触发满判定,停止入队 - 执行两次出队操作,
front移动到下标2的位置,数组下标0、1的空间已经被释放 - 再次入队元素F:此时
rear_index为0,将F写入下标0的位置,更新rear_index = (0+1)%5=1,成功复用了之前空出的头部空间,没有触发越界错误
补充:该逻辑完全可以复用给出队时的front索引更新,出队时执行
front = (front + 1) % arraySize即可实现front的环形跳转。
内容的提问来源于stack exchange,提问作者samurai
相关产品推荐
相关产品推荐

