【问题标题】:insert method for Priority Queue using Linked Lists使用链表插入优先队列的方法
【发布时间】:2016-11-16 15:10:37
【问题描述】:

首先我觉得我应该提一下这是一个任务。我不是在寻找直接的代码答案,只是为了给我指明正确的方向。我们被要求在链表中实现优先级队列。

我正在努力编写 insert() 函数的第一部分。在代码中,我尝试检查head 是否包含任何内容,如果没有,则将head 设置为pqItem。它会这样做,但是当再次调用 insert 以进行第二次插入时,它不会识别 head 中已经有 PQueueItem 并且只是覆盖 head 而不是忽略 if (this.head == null)。我没有正确设置head

PQueue 类

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);
        }
    }
}

PQueueItem 类

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);
}

}

插入的 JUnit 测试

@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>

控制台显示:

This is pqItem   [1,2]
Null    null
Null    [1,2]
Worked
This is pqItem   [Hiya,3]
Null    null
Null    [Hiya,3]

【问题讨论】:

  • 你能把你两次调用insert的代码部分贴出来吗?
  • 添加调用
  • 你能用英语解释一下应该发生什么if (priority &gt; head.getPriority())吗?
  • 如果pqItem 的优先级高于head 的优先级,它应该替换将head 向下移动并在head 所在的位置插入pqItem
  • 不要破坏你的问题。这是不允许的。抄送@petermcneil

标签: java


【解决方案1】:

这是一些伪代码代码。 (我已经通过创建队列对其进行了测试)

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 个项目。现在你想在队列中插入pqItempqItem 的优先级最低,所以它会被插入到队列的末尾,对吧?因此,您需要遍历队列(列表)才能到达最后一项。

【讨论】:

  • 首先感谢您的回复!我将错误的插入方法更改为:prev = head; head = pqItem; head.setNext(prev);
  • 抱歉编辑失败。我尝试实现您的方法来检查 head 是否为空,但是当再次调用 insert 时它仍然发现 head 为空。我不明白为什么再次调用时它不会保留PQueueItem,我无法正确归因。
  • @petermcneil 它应该可以工作。也许你的 pop 方法有问题?另外,您还没有写任何priority &lt;= head.getPriority( ) 时会发生什么。
  • 非常感谢!我进行了更多修改并实现了priority &lt;= head.getPriority() 方法并且它有效。非常感谢再次为我减轻了很多压力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
相关资源
最近更新 更多