1

这似乎是一个非常基本的问题,但我已经被困了几个小时。

我们什么时候使用 enqueue/dequeue 方法以及什么时候使用 offer/poll?!

我想用void enqueue(int x, int p)andint dequeue()方法创建一个整数的 PQ,如何声明这样的队列?

谢谢。

4

1 回答 1

7

我假设“PQ”的意思是“优先队列”。我从来没有使用过这样的队列(我对队列的印象是严格的 FIFO 结构),但是在阅读文档之后,我认为您可以这样做:

首先,您需要创建要存储在队列中的对象的类。假设int内容和int优先级:

public class MyClass implements Comparable<MyClass> {
    private int x, p;

    /*
     * x: Contents
     * p: Priority
     */
    public MyClass(int x, int p) {
        this.x = x;
        this.p = p;
    }

    @override
    public int compareTo(MyClass o) {
        return this.p - o.p;
    }

    public int getX() {
        return x;
    }
}

现在,创建您的优先队列。如果我正确理解了类文档,它将使用该compareTo 方法对您的对象进行排序:

....
PriorityQueue<MyClass> pq = new PriorityQueue<MyClass>();
....
pq.add(new MyClass(x, p));
....

检查:http ://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html

Java队列没有enqueueanddequeue方法;这些操作是使用以下方法完成的:

  • 排队:
    • add(e): 插入对象失败抛出异常
    • offer(e):false如果插入对象失败则返回
  • 出队:
    • remove(): 如果队列为空则抛出异常
    • poll():null如果队列为空则返回
  • 看看队列中的第一个对象:
    • element(): 如果队列为空则抛出异常
    • peek():null如果队列为空则返回

现在,最后:何时使用offerand add

关于offeradd:嗯,这取决于你想如何处理插入失败的队列:

Queue从Collection继承的add方法插入一个元素,除非它违反队列的容量限制,在这种情况下它会抛出IllegalStateExceptionoffer方法仅用于有界队列,与add only的不同之处在于它通过返回false来指示插入元素失败。

(参见:http ://docs.oracle.com/javase/tutorial/collections/interfaces/queue.html )

希望这可以帮助你

于 2012-11-03T16:09:23.887 回答