这似乎是一个非常基本的问题,但我已经被困了几个小时。
我们何时使用方法入队/出队&我们什么时候使用offer / poll?!
我想用void enqueue(int x, int p)
和int dequeue()
方法创建一个整数PQ,如何声明这样的队列?
感谢。
答案 0 :(得分:6)
我假设“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
和dequeue
方法;这些操作使用以下方法完成:
add(e)
:如果无法插入对象,则抛出异常offer(e)
:如果无法插入对象,则返回false
remove()
:如果队列为空则抛出异常poll()
:如果队列为空,则返回null
element()
:如果队列为空则抛出异常peek()
:如果队列为空,则返回null
现在,最后:何时使用offer
和add
?
关于offer
和add
:嗯,这取决于您希望如何处理队列中插入的失败:
添加方法,队列继承自 Collection ,插入一个元素,除非它违反了队列的容量限制,在这种情况下它抛出 IllegalStateException 。 商品方法仅用于有界队列,与 add 的区别仅在于它表示无法通过返回来插入元素假
(见:http://docs.oracle.com/javase/tutorial/collections/interfaces/queue.html)
希望这有助于你
答案 1 :(得分:1)
排队: add(e):如果无法插入对象,则引发异常 offer(e):如果无法插入对象,则返回false 出队: remove():如果队列为空,则引发异常 poll():如果队列为空,则返回null 看一下队列中的第一个对象: element():如果队列为空,则引发异常 peek():如果队列为空,则返回null 现在,最后:什么时候使用offer和添加?
关于报价和添加:好吧,这取决于您要如何处理插入队列中的失败:
Queue继承自Collection的add方法插入一个元素,除非它违反队列的容量限制,在这种情况下,它将抛出IllegalStateException。 offer方法只适用于有界队列,它与add的不同之处仅在于它表示无法通过返回false插入元素。
(请参阅:http://docs.oracle.com/javase/tutorial/collections/interfaces/queue.html)