循环队列isFull函数始终返回1的问题及修复咨询
循环队列isFull函数错误修复问题
我编写了一个用于判断循环队列是否已满的isFull函数,但它始终返回1(即“true”)。以下是我的队列定义:
#define MAX_LENGTH 150 typedef double ElementType; typedef int bool; typedef struct { ElementType Elements[MAX_LENGTH]; int front; int rear; } Queue;
我的isFull函数如下:
int isFull(Queue Q) { if (Q.front == Q.rear++) return 1; if ((Q.rear == MAX_LENGTH) && (Q.front == 0)) return 1; return 0; }
即使队列中还未存入任何元素,该函数也总是返回1表示队列已满。我该如何修复?
编辑说明
我将Q.rear++修改为Q.rear+1,队列初始化函数如下:
void resetQueue(Queue *Q) { Q->front = -1; Q->rear = -1; };
我发现问题出在:
if (Q.front == Q.rear+1) return 1;
这部分。现在我只能往队列中存入2个元素,存入第三个时就会被判定为已满。
问题分析与修复方案
1. 最初函数始终返回1的原因
你最初使用了Q.rear++,这是后置自增运算符,会先使用Q.rear的原始值进行比较,再对其自增。队列初始化后front和rear均为-1,执行Q.front == Q.rear++时,会先比较-1 == -1,结果为真,直接返回1,这就是空队列也被判定为满的核心原因。
2. 修改后只能存2个元素的原因
改成Q.rear+1后,空队列的判断问题解决了,但你的判断逻辑没有考虑循环队列的模运算特性:
- 直接用
front == rear+1只适用于非循环的线性队列,无法处理循环场景(比如rear处于数组末尾,front处于数组开头的情况); - 你的初始化模式是
front=-1、rear=-1(用该状态标记空队列),对应的满队列判断应该是下一个待插入位置等于front,而非简单的数值比较。
3. 正确的实现代码
修复后的isFull函数
int isFull(Queue Q) { // 计算下一个待插入的rear位置,用模运算处理循环 int nextRear = (Q.rear + 1) % MAX_LENGTH; // 当nextRear等于front时,队列已满 return nextRear == Q.front; }
配套的队列操作函数(保证逻辑一致性)
// 判空函数 int isEmpty(Queue Q) { return Q.front == -1; } // 入队函数 void enqueue(Queue *Q, ElementType e) { if (isFull(*Q)) { printf("队列已满,无法入队\n"); return; } if (isEmpty(*Q)) { // 空队列时初始化front为0 Q->front = 0; } // 计算下一个rear位置,处理循环 Q->rear = (Q->rear + 1) % MAX_LENGTH; Q->Elements[Q->rear] = e; } // 出队函数 ElementType dequeue(Queue *Q) { if (isEmpty(*Q)) { printf("队列已空,无法出队\n"); // 返回一个特殊值,可根据需求调整 return 0.0; } ElementType val = Q->Elements[Q->front]; if (Q->front == Q->rear) { // 出队后队列变空,重置标记 Q->front = -1; Q->rear = -1; } else { // 计算下一个front位置,处理循环 Q->front = (Q->front + 1) % MAX_LENGTH; } return val; }
采用这套逻辑后,队列可以正确存储MAX_LENGTH个元素,且空队列、满队列的判断都能正常工作。
内容的提问来源于stack exchange,提问作者Đặng Hào Quang
相关产品推荐
相关产品推荐

