我正在尝试使用数组实现Queue。 (不使用内置的Java Queue函数)。但是,在测试时,只有当size == maxSize时,数组才会打印出来(如数组大小达到maxSize / capacity)。除了在大小小于maxSize时不打印,测试用例通过。 (它是一个双端队列,因此可以将元素添加到正面和背面)。有什么建议吗?
package vipQueueArray;
import java.util.NoSuchElementException;
public class vipQueue {
private Object[] array;
private int size = 0;
private int head = 0; // index of the current front item, if one exists
private int tail = 0; // index of next item to be added
private int maxSize;
public vipQueue(int capacity) {
array = new Object[capacity];
maxSize = capacity;
size = 0;
tail = maxSize - 1;
}
public Object Dequeue() {
if (size == 0) {
throw new NoSuchElementException("Cant remove: Empty");
}
Object item = array[head];
array[head] = null;
head = (head + 1) % array.length;
size--;
return item;
}
public void EnqueueVip(Object x) {
if (size == maxSize) {
throw new IllegalStateException("Cant add: Full");
}
array[tail] = x;
tail = (tail - 1) % array.length;
size++;
}
public void Enqueue(Object y) {
if (size == maxSize) {
throw new IllegalStateException("Cant add: Full");
}
array[head] = y;
head = (head + 1) % array.length;
size++;
}
public boolean isFull() {
return (size == maxSize);
}
public boolean isEmpty() {
return (size == 0);
}
}
public class Test{
public static void main(String[] args){
vipQueue Q = new vipQueue(2);
Q.Enqueue(4);
System.out.printf("->%d", Q.Dequeue());
} }
答案 0 :(得分:4)
你出去了:
head = (head + 1) % array.length;
你应该(根据你的impl。)将其改为:
head = (head - 1) % array.length;
<强>加成强>:
这不是队列的实现:队列在FIFO中工作,你实现的是LIFO,它实际上更像是...堆栈。
为了实现一个队列,你应该从头部和头部开始。尾指向数组[0]。
然后每个插入都是addAtTail()
,这意味着该项将在数组[tail]输入:
array[tail] = item;
tail++;
size++;
当tail == array.length(抛出异常)时停止插入。
出队意味着删除array[tail-1]
处的项目,然后执行:
tail--;
size--;
答案 1 :(得分:1)
当你入队时,你正在设置head = head + 1.当你出队时,你将返回数组[head]
Ergo,在Enqueue之后,head = 1,但是您添加的项目位于插槽0中。
此外,如果队列中没有任何内容,那么tail = capacity-1肯定会造成麻烦。烯