首先,我觉得我应该提到这是一项任务。我没有找到直接的代码答案,只是为了指出我正确的方向。我们被要求在链表中实现优先级队列。
我正在努力编写insert()函数的第一部分。在代码中,我尝试检查head
是否包含任何内容,如果没有,则将head
设置为pqItem
。它会这样做,但是当第二次插入再次调用insert时,它不会识别出head
中已有PQueueItem
并且只覆盖head
而不是忽略{{ 1}}。我没有正确设置if (this.head == null)
吗?
PQueue Class
head
PQueueItem类
package ci284.ass1.pqueue;
public class PQueue<T> {
private PQueueItem<T> head;
public static enum ORDER {
ASC, DESC;
}
public static ORDER DEFAULT_ORDER;
private ORDER order;
public PQueue() {
this.order = DEFAULT_ORDER;
head = null;
}
...
public void insert(T data, int priority) {
PQueueItem<T> pqItem = new PQueueItem<T>(data, priority);
PQueueItem<T> temp;
PQueueItem<T> prev;
System.out.println("This is pqItem " + pqItem);
if (this.order == ORDER.DESC || this.order == DEFAULT_ORDER){
if (this.head != null){
System.out.println("Not null " + head);
if (priority <= head.getPriority()){
}
else if (priority > head.getPriority()){
prev = head;
System.out.println(prev);
head.setNext(head);
prev = pqItem;
System.out.println(prev);
}
}
if (this.head == null){
System.out.println("Null " + head);
this.head = pqItem;
System.out.println("Null " + head);
}
}
}
插入的JUnit测试
package ci284.ass1.pqueue;
public class PQueueItem<T> {
private int priority;
private T data;
private PQueueItem<T> next;
public PQueueItem(T data, int priority) {
this.data = data;
this.priority = priority;
}
public int getPriority() {
return priority;
}
public void setPriority(int priority) {
this.priority = priority;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public PQueueItem<T> getNext() {
return next;
}
public void setNext(PQueueItem<T> next) {
this.next = next;
}
public String toString() {
return String.format("[%s,%d]", data.toString(), priority);
}
}
测试返回:
@Test
public void testInsertStart(){
PQueue<String> pq = new PQueue<String>();
pq.insert("1",2);
String head = pq.pop();
assertEquals(head, "1");
System.out.println("Worked");
pq.insert("Hiya",3);
assertEquals(head, "Hiya");
}
,控制台显示:
org.junit.ComparisonFailure: expected:<1> but was:<Hiya>
答案 0 :(得分:0)
这是一些伪代码代码。 (我已经通过创建队列测试了它)
public void insert(int priority, int data) {
Item item = new Item(priority, data);
if (head == null) {
head = item;
item.setNext(null);
} else {
Item next = head;
Item prev = next;
do {
if (priority > next.getPriority()) {
// break and insert
break;
}
prev = next;
next = next.getNext();
} while (next != null);
item.setNext(next);
if (item.getPriority() > head.getPriority()) {
head = item;
} else prev.setNext(item);
}
}
您的插入方法存在以下问题:
prev = head;
head.setNext(head);
prev = pqItem;
这段代码甚至做了什么?这是它的作用:
您也没有考虑队列中有两个以上项目的情况。想象一下,队列中有5个项目。现在您要在队列中插入pqItem
。 pqItem
优先级最低,因此会在队列末尾插入,对吧?因此,您需要遍历队列(列表)才能到达最后一个项目。