【问题标题】:implementing queue with arrays用数组实现队列
【发布时间】:2016-09-13 00:57:18
【问题描述】:

我很困惑为什么我的队列不工作,我认为入队和出队方法存在问题。但我不确定,我应该在初始数组大小设置为 8 的情况下实现类。一旦元素数量超过大小,数组大小将加倍。从数组的开头删除一个元素后,您需要将数组中的所有元素向左移动一个位置。编写一个测试程序,将 1 到 20 的 20 个数字添加到队列中,然后删除这些数字并显示它们。这是我的代码

    public class Queue {
    private int[] elements;
    private int size;
    private int first;
    private int last;
    public static final int DEFAULT_CAPACITY = 8;

    public Queue(){
        this (DEFAULT_CAPACITY);
    }
    public Queue (int capacity){
        elements = new int[capacity];
        first = 0;
        last = 0;
        size = 8;
    }
    public void Enqueue(int v){ //fills queue and lengthens if necessary
        if (last>=size){
            int[] temp = new int[elements.length*2];
        System.arraycopy(elements, 0, temp, 0, elements.length);
            elements = temp;
        }
        elements[last]=v;
        last++;

    }
    public int Dequeue(){    
         int output = elements[first];
         System.out.print(output + " ");
        while(last != 0){
            for(int i = 0; i<last;i++){
                elements[i]= elements[i-1];
            }
            last--;
        }
        return output ;
    }
    public boolean empty(){ // tests for empty queue


        return last==first;

    }
    public int getSize(){
        size=last;
        return size;
    }
    }

这里是测试器类。

    public class QueueTester {
    public static void main(String[] args){
        Queue q = new Queue();
        q.Enqueue(1);
        q.Enqueue(2);
        q.Enqueue(3);
        q.Enqueue(4);
        q.Enqueue(5);
        q.Enqueue(6);
        q.Enqueue(7);
        q.Enqueue(8);
        q.Enqueue(9);
        q.Enqueue(10);
        q.Enqueue(11);
        q.Enqueue(12);
        q.Enqueue(13);
        q.Enqueue(14);
        q.Enqueue(15);
        q.Enqueue(16);
        q.Enqueue(17);
        q.Enqueue(18);
        q.Enqueue(19);
        q.Enqueue(20);
        while (q.empty()){
            q.Dequeue();

【问题讨论】:

  • 是否要求您在开头而不是结尾插入元素?在数组末尾排队和出队会更有效率。

标签: java queue


【解决方案1】:
while(last != 0){
    for(int i = 0; i<last;i++){
        elements[i]= elements[i-1];
    }
    last--;
}

删除 while 循环。如果您要确保它没有使空队列出队,请进行 if 条件检查以确保大小 > 0。

 public int Dequeue(){
         if (getSize() == 0) {
             // throw an error or something
         }    
         int output = elements[first];
         System.out.print(output + " ");
         for(int i = 0; i<last;i++){
             elements[i]= elements[i-1];
         }
         last--;
         return output ;
    }

此外,您需要在测试程序类中打印输出,并且我假设您想在队列不为空时出列:

 while (!q.empty()){
            System.out.println(q.Dequeue());

【讨论】:

  • 这仍然不能解决问题,在测试器中调用 q.dequeue() 时它不会打印输出
【解决方案2】:

嗯,认为您使用的算法不正确尝试引用此 http://projectyogisha.com/implementing-queues/ ,但它是 C 语言。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 2012-01-30
    相关资源
    最近更新 更多