【问题标题】:Queue implementation as Array队列实现为 Array
【发布时间】:2013-11-22 18:37:33
【问题描述】:

所以我被要求在数组中实现队列,直到我看到在我出列并尝试将另一个值入队后得到一个有趣的输出之前我没有遇到任何问题......
例如(输出):

Queue: [1]     //Enqueue 1  
Queue: [1, 2]  //Enqueue 2
Queue: [2]      //Dequeue
Queue: [2, 2]   //Enqueue 3
Queue: [2, 2, 3] //Enqueue 4
Queue: [5, 2, 3, 4]  //Now is a total mess...

我的代码包含队列、双端队列和调整大小方法,一切正常,我真的完全不知道如何修复它...... 如果您想尝试,这是我的主要代码。谢谢。

public class MainQueue {
    public static void main(String[] args) {

        int capacity=5;
        Queue<Integer> queue = new Queue<Integer>(capacity);

        queue.enqueue(1);
        System.out.println("Queue: "+ queue);
        queue.enqueue(2);
        System.out.println("Queue: "+ queue);
        queue.dequeue();
        queue.enqueue(3);
        System.out.println("Queue: "+ queue);
        queue.enqueue(4);
        System.out.println("Queue: "+ queue);
        queue.enqueue(5);
        System.out.println("Queue: "+ queue);

    }
}

import java.util.NoSuchElementException;


public class Queue<E> {
    private E[] elements;//array in generic
    private int front;//first element or front of the queue
    private int back;//last element or back of the queue
    private int capacity; //capacity of the queue
    private int count; //indicates number of elements currently stored in the queue

    public Queue(int size)
    {
        capacity = size;
        count = 0;
        back = size-1;
        front = 0;
        elements =(E []) new Object[size];  //queue array empty
    }

    //Returns true if the queue is empty or false
    public boolean isEmpty()
    {
        return count==0;//means its true
    }

    //Add elements to the queue
    public void enqueue(E item)
    {
        if(count == capacity)
        {
            resize(capacity*2);
            // System.out.println("Queue is full");

        }

        back =(back+1) % capacity;    //example back=(0+1)%10=1
        elements[back]=item;
        //elements[0]=0
        //item=elements[count];
        count++;
    }


    //Public resize
    public void resize(int reSize){
        E[] tmp = (E[]) new Object[reSize];

        int current = front;
        for (int i = 0; i &lt; count; i++)
        {
            tmp[i] = elements[current];
            current = (current + 1) % count;
        }

        elements = tmp;
        front = 0;
        back = count-1;
        capacity=reSize;

    }


    //Dequeue method to remove head
    public E dequeue()
    {
        if(isEmpty())
        throw new NoSuchElementException("Dequeue: Queue is empty");
        else
        {
            count--;
            for(int x = 1; x <= count; x++)
            {
                elements[x-1] = elements[x];
            }
            capacity--;
            return (E) elements;
        }
    }

    //peek the first element
    public E peek()
    {
        if(isEmpty())
        throw new NoSuchElementException("Peek: Queue is empty");

        else
        return elements[front];
    }


    //Print queue as string
    public String toString()
    {

        if(isEmpty()) {
            throw new NoSuchElementException("Queue is empty");
        }

        String s = "[";
        for(int i = 0; i < count; i++)
        {
            if(i != 0)
            s += ", ";
            s = s + elements[i];// [value1,value2,....]
        }

        s +="]";
        return s;
    }

    public void delete() {   //Delete everything
        count = 0;
    }
}

【问题讨论】:

  • 为什么dequeue的时候要减少容量?
  • 这在我的机器上按预期工作...我得到 [1]、[1,2]、[2]、[2,3]、[2,3,4] 和 [ 2,3,4,5]。
  • 这很奇怪,因为我不断收到重复的数字和放置在随机索引中的数字......你在哪里尝试过?
  • @HunterMcMillen 我确实想过,但即使我把它取下来也没有任何区别,因为当我调整容量时,容量会被修改,无论如何是的,我应该把它取下来......
  • @LilithDeficiency,没关系。如果您的初始容量足够大以进行初始出队,则它不起作用。如果您将容量设置为 2,它似乎可以工作。

标签: java arrays methods queue


【解决方案1】:

您正在使用back 的当前值在enqueue() 方法中更新back,但您根本没有在dequeu() 方法中更新它。那将无法正常工作。其实你更应该根据count来计算back

只是改变:

back = (back + 1) % capacity;

到:

back = count % capacity;

【讨论】:

  • Thankkkkk youuuu 先生,您成就了我的一天!这行得通! :)
【解决方案2】:

dequeue 中,您没有更新back 变量,该变量确定您使用enqueue 添加新值的位置。此外,在 dequque 中,当您只有 1 中的 count 时,您可以从索引 1 复制索引 0 上不存在的值。这是一种特殊情况,如果您创建了一个容量(大小)为 1 的队列,将某些内容入队然后出队,则会出现越界错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 2013-04-05
    • 2018-01-22
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多