循环队列 队列长度的推导

循环队列是一种先进先出的数据结构,它将数组的首尾相连,形成逻辑上的环状空间,供队列循环使用。在循环队列中,队列长度可以通过队尾指针(Rear,通常用R表示)、队头指针(Front,通常用F表示)以及队列的最大长度(MaxSize)来计算。队列长度的计算公式为:队列长度 = (Rear - Front + MaxSize) % MaxSize。以下是对该公式的详细推导:

一、初始条件

  • 队头指针Front和队尾指针Rear都指向队列的起始位置,即Front = Rear = 0。
  • 队列的最大长度为MaxSize。

二、指针移动规则

  • 入队操作:在队列未满时,将新元素放在队尾指针Rear所指的位置,然后Rear加1(注意取模MaxSize,实现循环)。
  • 出队操作:在队列不为空时,移除队头指针Front所指的元素,然后Front加1(注意取模MaxSize,实现循环)。

三、公式推导

  1. 当Rear > Front时:

    • 队列中的元素位于Front和Rear之间(不包括Rear所指的位置,因为Rear总是指向下一个空位置)。
    • 因此,队列长度 = Rear - Front。
  2. 当Rear < Front时:

    • 由于队列是循环的,当Rear小于Front时,队列实际上跨越了数组的末尾。
    • 队列中的元素包括从Front到数组末尾的元素,以及从数组起始位置到Rear之前的元素。
    • 因此,队列长度 = MaxSize - Front + Rear(这里利用了模运算的性质,因为Rear和Front都是在0到MaxSize-1之间循环的)。
    • 例: 假设Q.rear=3,Q.front=5,那么队列占得单元有Q.front开头的Q.data5、Q.data6、Q.data7...Q.data95个单元,再加上Q.rear往下数的Q.data2、Q.data1、Q.data0三个单元,一共有8个单元。则MaxSize-Q.front=5,MaxSize-Q.front+Q.rear=8
  3. 统一公式:

    • 为了将上述两种情况统一为一个公式,我们可以观察到:
      • 当Rear > Front时,(Rear - Front + MaxSize) % MaxSize = Rear - Front(因为余数就是Rear - Front本身)。
      • 当Rear < Front时,(Rear - Front + MaxSize) % MaxSize = MaxSize - Front + Rear(因为此时Rear - Front是负数,加上MaxSize后变为正数,再取模得到正确的队列长度)。
    • 因此,无论Rear和Front的相对位置如何,队列长度都可以用公式(Rear - Front + MaxSize) % MaxSize来计算。

四、公式验证

  • 队列为空时:Front = Rear,队列长度 = (Rear - Front + MaxSize) % MaxSize = 0。
  • 队列满时(但未满溢):(Rear + 1) % MaxSize = Front(此时不能再入队),队列长度 = (Rear - Front + MaxSize) % MaxSize = MaxSize - 1(因为有一个位置是空的,用于区分队满和队空)。注意,这里说的是"未满溢"的满队列状态,即队列中还有一个空位用于判断队列是否已满。在实际应用中,可能会通过其他方式(如设置一个额外的标志位)来判断队列是否已满。

综上所述,循环队列的队列长度公式(Rear - Front + MaxSize) % MaxSize能够正确地计算队列的长度,无论是插入元素还是删除元素都能准确地反映队列的变化情况。

相关推荐
xuxigifxfh9 分钟前
牛客:BISHI2 【模板】栈的操作
java·开发语言·windows·算法
aqiu11111125 分钟前
【C++算法打怪专栏】LeetCode 402. 移掉 K 位数字(单调栈 + 贪心)
c++·算法·leetcode
糖果豆豆1 小时前
对象是字段,还是关系?集合论和范畴论吵了三十年,答案是两个都对
算法·架构
第六种自由1 小时前
[路飞]_Leetcode 22. 括号生成
javascript·算法·leetcode
isyoungboy1 小时前
事件驱动状态机与循环扫描状态机:两种计算模型的比较研究
算法·状态机
行者全栈架构师1 小时前
【鸿蒙心迹】从手机到平板、折叠屏——多端适配自查清单与踩坑实录(HarmonyOS 7.x)
前端·算法·架构
longlongzihan2 小时前
LeetCode 24.两两交换链表中的节点:虚拟头结点与指针
算法·leetcode·链表
residual_fan2 小时前
基于控制感知域对抗网络的变工况故障诊断:从控制系统与运行状态协同的角度建立模型
人工智能·算法·数据挖掘·数据分析
翻山越岭的少年2 小时前
用控制信号理解状态变化:基于控制感知域对抗网络的变工况故障诊断
算法
longlongzihan2 小时前
从LeetCode 19. 删除链表的倒数第 N 个结点深入理解“哨兵节点”
c++·算法·leetcode·链表