You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

循环队列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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 12:15:38