循环队列中由于front与rear指针位置定义不同导致的判空、判满条件差异

花了好长时间将这四种组合理了一下,希望对自己和大家有所帮助,要是您发现哪里不妥,还请多多指点呀,先谢过啦!

通过牺牲一个存储空间来判断循环队列的空和满状态,以下是基于这个前提下,针对不同的 frontrear 定义方式的判空、判满条件及计算队列元素个数的方法:

1. front指向队头元素的前一个位置,rear指向队尾元素的后一个位置

  • 队空条件: (Q.front + 1) % MaxSize == Q.rear
  • 队满条件: (Q.rear + 1) % MaxSize == Q.front
  • 队列元素数: (rear - front - 1 + MaxSize) % MaxSize

2. front指向队头元素,rear指向队尾元素的下一个位置

  • 队空条件: Q.front == Q.rear
  • 队满条件: (Q.rear + 1) % MaxSize == Q.front
  • 队列元素数: (rear - front + MaxSize) % MaxSize

3. frontrear都直接指向它们所代表的元素(牺牲一个存储空间)

  • 队空条件: Q.front == Q.rear
  • 队满条件: (Q.rear + 1) % MaxSize == Q.front
  • 队列元素数: (rear - front + MaxSize) % MaxSize

注意:尽管在这种情况下,frontrear 都直接指向元素本身,但由于我们采用了牺牲一个存储空间的方法,因此判满和判空条件与第二种情况相同。

4. front指向队头元素的前一个位置,rear直接指向队尾元素

这种情况下,为了符合牺牲一个存储空间的原则,我们需要调整判满和判空条件,使其与其它情况保持一致:

  • 队空条件: (Q.front + 1) % MaxSize == Q.rear
  • 队满条件: (Q.rear + 1) % MaxSize == Q.front
  • 队列元素数: (rear - front + MaxSize - 1) % MaxSize
    1. 队空条件 (Q.front + 1) % MaxSize == Q.rear
    • 这个条件用来判断队列是否为空。按照你的描述,front 指向队头元素的前一个位置,rear 指向队尾元素的后一个位置。因此,在队列为空的情况下,front 实际上是指向最后一个“逻辑”元素之后的位置,而 rear 是指向下一个待插入元素的位置。所以,当 (Q.front + 1) % MaxSize == Q.rear 成立时,表示队列为空。这个条件是正确的。
  1. 队满条件 (Q.rear + 1) % MaxSize == Q.front

    • 当队列满的时候,rear 下一个位置就是 front 的位置,因为此时队列已经没有额外的空间来插入新的元素了(这里假设有一个元素的空间未被使用以区分队空和队满的情况)。因此,该条件也是正确的,用以判断队列是否已满。
  2. 队列元素数 (rear - front - 1 + MaxSize) % MaxSize

    • 这个公式用来计算当前队列中的元素数量。但是,根据对 frontrear 的定义(front 指向队头元素的前一个位置,rear 指向队尾元素的下一个位置),计算队列长度的正确公式应该是 (rear - front - 1 + MaxSize) % MaxSize。这里的 -1 是因为 front 已经指在了队头元素之前的一个位置,所以需要减去这个偏移量。

你可能感兴趣的:(数据结构,数据结构,算法,线性代数)