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
相关产品推荐
相关产品推荐

