【问题标题】:Queue implementation with Array- Java使用 Array-Java 实现队列
【发布时间】:2013-09-23 03:59:38
【问题描述】:

我正在尝试使用数组实现队列。 (不使用内置的 Java Queue 函数)。但是,在测试时,数组只会在 size ==maxSize 时打印出来(因为数组的大小达到了 maxSize/容量)。除了在大小小于 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());
         }  }

【问题讨论】:

  • 我在代码中找不到任何问题,除了如何将元素添加到队列的前面。我认为问题出在测试用例本身,您也可以发布它吗?
  • posted,所以maxSize为2,只添加了一个元素。但出队打印出 null
  • EnqueueDequeue 都使用 head。我希望它来自堆栈,而不是队列。
  • @MarkPeters 对于这个实现它实际上很好,你不能“告诉”作为用户,如果你应该从头部或尾部出队,他的 dequeue 实现会照顾以一种非常优雅的方式(模数)。
  • @alfasin:如果您期望 FIFO 行为,那就不好了,这就是队列。我并不是说添加到尾部还是头部都重要,但是为两者使用一个光标变量似乎没有意义。

标签: java arrays queue


【解决方案1】:

你正在做的出队:

head = (head + 1) % array.length;

您应该(根据您的想法)将其更改为:

head = (head - 1) % array.length;

加法

这不是队列的实现:队列在 FIFO 中工作,而您实现的工作后进先出,实际上更像是一个...堆栈。

为了实现一个队列,你应该从头和尾都指向数组[0]开始。 然后每个插入都是addAtTail(),这意味着该项目将在array[tail]处输入:

array[tail] = item;
tail++;
size++;

tail == array.length 时停止插入(抛出异常)。

出队意味着删除array[tail-1]处的项目,然后执行:

tail--;
size--;

【讨论】:

  • 我猜他正在尝试做一些事情,如果您在插槽 1 2 3 中有物品,并且您删除了物品 1,那么头部应该是 2,而不是 0。(但他不应该是无论如何从头部移除,如果它是一个“队列”)。
  • 我正在删除前面的元素...在我的出列函数中
  • @James 你是对的 - 这个 Queue 的实现更像是一个堆栈 :) 当你排队时头部不应该“移动”,只有尾部......
  • @alfasin 我猜这确实是一个出队,函数名称有些模糊。
  • 没关系。我修好了它。我切换了 Enqueue、EnqueueVip 功能。然后切换head和tail的初始值。
【解决方案2】:

入队时,设置 head = head + 1。出队时,返回 array[head]

所以,在 Enqueue 之后,head = 1,但你添加的项目在 slot 0 中。

另外,tail = capacity-1,当队列中没有任何东西时必然会造成麻烦。恩

【讨论】:

  • 那么您的建议到底是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 2012-05-15
  • 2015-06-17
相关资源
最近更新 更多