public class PriorityQueue<T> {
private PriorityNode<T> head, tail;
private int numItems;
public PriorityQueue(){
numItems = 0;
head=null;
tail=null;
}
public void add(int priority, T value){
PriorityNode<T> newNode = new PriorityNode<T>(priority,value);
if(numItems == 0){
head = newNode;
tail = newNode;
}
else{
head.setNext(newNode);
head = newNode;
}
}
}
其中PriorityNode定义为:
public class PriorityNode<T> implements Comparable<T> {
private T value;
private PriorityNode<T> next;
private int priority;
public PriorityNode(int priority,T newValue){
value = newValue;
next = null;
priority = 0;
}
public PriorityNode(T newValue){
value = newValue;
next = null;
priority = 0;
}
public void setPriority(int priority){
this.priority = priority;
}
public int getPriority(){
return this.priority;
}
public T getValue(){
return value;
}
public PriorityNode<T> getNext(){
return next;
}
public void setNext(PriorityNode<T> nextNode){
this.next = nextNode;
}
public void setValue(T newValue){
value = newValue;
}
@Override
public int compareTo(int pri) {
// TODO Auto-generated method stub
if(this.priority<pri){
return -1;
}
else if(this.priority == pri){
return 0;
}
else{
return 1;
}
}
}
我在使用比较器并实现优先级队列时遇到了很多困难 - 请指出正确的方向。
答案 0 :(得分:3)
不要使用树结构来实现优先级队列。使用heap。它更节省空间,需要更少的内存分配,并且对于大多数操作来说都是O(log(N))。
答案 1 :(得分:3)
关于比较器的实现,实现Comparator<T>
或Comparable<T>
接口需要覆盖public int compareTo(T o)
方法。
在给出的示例代码中,compareTo(T)
方法未被覆盖(compareTo(int)
方法已定义,但不方法签名相同),因此,它可能会导致编译错误。
答案 2 :(得分:-1)
我认为你对自己有点过于强硬,优先级队列可以通过基于数组的堆高效实现:更简单,更高效(读取:连续的内存区域)。