这似乎是一个非常基本的问题,但我已经被困了几个小时。
我们什么时候使用 enqueue/dequeue 方法以及什么时候使用 offer/poll?!
我想用void enqueue(int x, int p)
andint dequeue()
方法创建一个整数的 PQ,如何声明这样的队列?
谢谢。
我假设“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队列没有enqueue
anddequeue
方法;这些操作是使用以下方法完成的:
add(e)
: 插入对象失败抛出异常offer(e)
:false
如果插入对象失败则返回remove()
: 如果队列为空则抛出异常poll()
:null
如果队列为空则返回element()
: 如果队列为空则抛出异常peek()
:null
如果队列为空则返回现在,最后:何时使用offer
and add
?
关于offer
和add
:嗯,这取决于你想如何处理插入失败的队列:
Queue从Collection继承的add方法插入一个元素,除非它违反队列的容量限制,在这种情况下它会抛出IllegalStateException。offer方法仅用于有界队列,与add only的不同之处在于它通过返回false来指示插入元素失败。
(参见:http ://docs.oracle.com/javase/tutorial/collections/interfaces/queue.html )
希望这可以帮助你