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

Java中基于数组的Queue无法正常工作,求排查修复(限用给定变量方法)

你的基于数组的队列问题分析与修复方案

我帮你梳理下代码里的几个问题,这些都是新手用数组实现队列时容易踩的坑:

1. numElements() 方法计算元素数量错误

你现在的实现是通过循环统计,但循环条件是 x < this.last,这会导致统计结果比实际元素数少1。比如当队列里有3个元素时,last 是2(索引从0开始),循环只会执行2次,返回的数量是2,而实际是3。

修复方式:不用循环,直接返回 last + 1 就行——因为 last 从-1开始,空队列时 last=-1,返回0;有1个元素时 last=0,返回1,完全符合实际元素数量,还更高效。

2. isFull() 方法判断逻辑错误

现在你依赖错误的 numElements() 来判断队列是否已满,这会导致判断结果不准确。其实队列满的条件很直接:当 last 等于数组的最大索引(也就是 numElements - 1)时,队列就满了。

修复方式:把 isFull() 的实现改成:

public boolean isFull(){
    return (last == this.numElements - 1);
}

3. print() 方法打印了整个数组(包括未使用的位置)

你的 print() 用增强for循环遍历了整个数组,而数组初始化时默认值是0,那些没被赋值的位置会被打印出来;另外 dequeue 后,数组后面的旧值也没被清空,这就导致你看到了多余的0和旧元素。

修复方式:只遍历队列中实际存在的元素,也就是从索引0到 last:

public void print(){
    System.out.println("\nElements: ");
    for(int x = 0; x <= last; x++){
        System.out.println(elements[x]);
    }
}

4. enqueue() 缺少队列满的判断(可选但重要)

虽然你说暂时不处理错误控制,但如果队列已满还执行 enqueue,会抛出数组越界异常。建议加上判断,避免程序崩溃。


修复后的完整代码

/**
 * Int Queue
 */
public class Queue{
    /** Max num elements*/
    private int numElements;
    /** Array to save elements **/
    private int elements[];
    /** Indice to last element */
    private int last;
    /** Constructor to init the state object */
    Queue(int numElements){
        this.numElements = numElements;
        this.elements = new int[numElements];
        this.last = -1;
    }
    /** Is empty the queue? */
    public boolean isEmpty(){
        return (last == -1);
    }
    /** Is full the queue */
    public boolean isFull(){
        return (last == this.numElements - 1);
    }
    /** Insert an element in the queue */
    public void enqueue(int element) {
        if(isFull()){
            System.out.println("Queue is full, cannot enqueue element!");
            return;
        }
        last++;
        elements[last]= element;
    }
    /** Extract the element in the queue.
     * There isn't control error */
    public int dequeue() {
        int elem = elements[0];
        for (int x = 0; x < last; x++){
            elements[x] = elements [x + 1];
        }
        last --;
        return elem;
    }
    /** Returns the number of elements in the queue */
    public int numElements(){
        return last + 1;
    }
    /** Print the elements in the queue*/
    public void print(){
        System.out.println("\nElements: ");
        for(int x = 0; x <= last; x++){
            System.out.println(elements[x]);
        }
    }
    public static void main(String args[]){
        // test the class
        System.out.println("Test the queue class");
        Queue que = new Queue(4);
        que.enqueue(1);
        que.enqueue(4);
        que.enqueue(5);
        que.print();
        que.dequeue();
        que.dequeue();
        que.print();
    } // main
} // Queue

修复后的输出

Test the queue class

Elements: 
1
4
5

Elements: 
5

这里说明下:你之前预期第二次打印“仅打印1”应该是笔误——因为你入队了1、4、5,两次出队会取出1和4,剩下的元素是5,这才是队列先进先出的正确行为。

内容的提问来源于stack exchange,提问作者user11518995

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 11:57:35