使用数组实现队列 - Java

时间:2012-11-04 23:18:29

标签: java arrays queue

我正在尝试使用数组实现队列ADT作业作业(由我决定我会使用链表,但我想教授希望我们学习新东西或XD的东西)。无论如何,我正在研究一种方法来将一个元素添加到队列的末尾,这个方法应该创建一个新的重新调整大小的数组,如果它超出范围,这就是我正在努力的方法( enqueue()方法)。这是我的代码:

import java.util.Arrays;


public class Queue<T> implements QueueInterface<T> {

    private T[] a;
    private int sz;

    public Queue(int capacity) {
        sz = 0;
        @SuppressWarnings("unchecked")
        T[] tempQueue = (T[])new Object[capacity];
        a= tempQueue;
    }

    public void enqueue(T newEntry) {
        try {
        for (int i=0; i<a.length; i++) {
                if (a[i] == null) {
                    a[i] = newEntry;
                    break;
                }
            }
        sz++;
        }
        catch (ArrayIndexOutOfBoundsException e) {
            @SuppressWarnings("unchecked")
            T[] tempQueue = (T[])new Object[a.length*+5];
            a= tempQueue;
            for (int i=0; i<a.length; i++) {
                if (a[i] == null) {
                    a[i] = newEntry;
                    break;
                }

            }
        }
    }

    public T dequeue() {
        T result = a[0];
        a[0] = null;
        for (int i=1; i<a.length;i++) {
            a[i-1] = a[i];
        }
        sz--;
        return result;
    }

    public T getFront() {
        return a[0];
    }

    public boolean isEmpty() {
        for (int i=0; i<a.length; i++) {
            if (a[i] != null) {
                return false;
            }
        }
        return true;
    }

    public void clear() {
        for (int i=0; i<a.length; i++) {
            a[i] = null;
            sz--;
        }
    }

    @Override
    public String toString() {
        return "Queue [a=" + Arrays.toString(a) + ", sz=" + sz + "]";
    }

}

非常感谢大家的时间!!!

5 个答案:

答案 0 :(得分:2)

如果要使用数组实现队列,我认为最好的方法是使用循环数组。这样,当dequeue时,您不必将所有元素向前移动一步。但是,由于您希望实现一个可重新调整大小(on-bounded)的队列,因此循环数组实现变得有点困难。这是一些有用的链接,

如果你想要一个实现,只需谷歌吧。

这可能不是您问题的答案,但我无法对您的问题发表评论。

答案 1 :(得分:1)

检查阵列长度以检测外部 - 异常是昂贵的。

要复制数组,请创建适当大小的新数组,然后使用System.arrayCopy

经验法则不是将尺寸增加固定数量,而是增加原始尺寸的百分比(例如增大30%)

答案 2 :(得分:0)

尝试将调整大小逻辑放入名为ensureSize的私有方法中。检查所需的尺寸;如果它太小,请调整阵列大小并复制内容。从可能需要增加数组大小的任何方法调用此方法。

答案 3 :(得分:0)

您的实现可能不是使用数组实现队列的最有效方法,但鉴于您决定以这种方式实现它,您的排队方法比它需要的要复杂一些。

您有一个字段sz,可用于确定新条目的放置位置,而不是通过检查来查找第一个非空值。无论如何,搜索非null都无法正常工作,因为dequeue没有清除最后一个向前移动的元素。

sz字段还会告诉您何时需要调整大小,而不是通过异常检测到该需求。

答案 4 :(得分:0)

补充Alan Krueger的回答:在调整大小时,你不必再遍历整个数组。创建一个临时变量,用于存储旧数组的长度并开始迭代它。