使用Array-Java实现队列

时间:2013-09-23 03:59:39

标签: java arrays queue

我正在尝试使用数组实现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());
         }  }

2 个答案:

答案 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肯定会造成麻烦。烯