循环队列区分队空队满的方法

循环队列中判断队空、队满及计算元素个数的三种常用方法及其异同如下:

方法判断队空条件判断队满条件元素个数计算方式主要特点与缺点
牺牲一个单元法front == rear(rear + 1) % maxsize == front(rear - front + maxsize) % maxsize简单易实现,约定队满时牺牲一个存储单元,最大容量为 maxsize-1
增设 size 成员法size == 0size == maxsizesize(直接记录元素个数)通过 size 直接表示元素个数,front 和 rear 指针相同时无法区分队空队满,需依赖 size
增设 tag 标志法front rear 且 tag 0front rear 且 tag 1(rear - front + maxsize) % maxsize通过 tag 标志区分队空和队满,front==rear 时根据 tag 判断,最大容量为 maxsize

详细说明

1. 牺牲一个单元法

  • 队空判断:当队头指针 front 和队尾指针 rear 相等时,队列为空。
  • 队满判断:当队尾指针的下一位置是队头指针时,即 (rear + 1) % maxsize == front,队列为满。
  • 元素个数:计算公式为 (rear - front + maxsize) % maxsize。
  • 特点:实现简单,广泛使用。但实际可存储元素数比数组长度少 1,因为牺牲了一个单元用来区分队满和队空。

2. 增设 size 成员法

  • 队空判断:size == 0,表示没有元素。
  • 队满判断:size == maxsize,表示元素已满。
  • 元素个数:直接通过 size 变量获取。
  • 特点:front 和 rear 指针相同时无法区分队空和队满,需依赖 size 变量。增加了一个成员变量,操作时需同步维护 size,增加了代码复杂度。

3. 增设 tag 标志法

  • 队空判断:front rear 且 tag 0,表示队空。
  • 队满判断:front rear 且 tag 1,表示队满。
  • 元素个数:同牺牲一个单元法,计算为 (rear - front + maxsize) % maxsize。
  • 特点:通过 tag 标志区分队满和队空,front 和 rear 指针相等时不再模糊。最大容量为 maxsize,不需牺牲存储空间。但需要在入队和出队操作中维护 tag 标志。

数组容量和循环队列实际容量

参数含义说明
maxsize数组容量循环队列数组的总大小
实际容纳元素数maxsize - 1为了区分队满与队空,牺牲一个存储单元
队满判断条件(rear + 1) % maxsize == front队尾指针的下一个位置是队头指针
队空判断条件front == rear队头指针与队尾指针相等