循环队列区分队空队满的方法
循环队列中判断队空、队满及计算元素个数的三种常用方法及其异同如下:
| 方法 | 判断队空条件 | 判断队满条件 | 元素个数计算方式 | 主要特点与缺点 |
|---|
| 牺牲一个单元法 | front == rear | (rear + 1) % maxsize == front | (rear - front + maxsize) % maxsize | 简单易实现,约定队满时牺牲一个存储单元,最大容量为 maxsize-1 |
| 增设 size 成员法 | size == 0 | size == maxsize | size(直接记录元素个数) | 通过 size 直接表示元素个数,front 和 rear 指针相同时无法区分队空队满,需依赖 size |
| 增设 tag 标志法 | front rear 且 tag 0 | front 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 | 队头指针与队尾指针相等 |