【问题标题】:Java Linked List Priority QueueJava 链表优先队列
【发布时间】:2017-01-03 12:00:14
【问题描述】:

我正在尝试使用链表在 java 中创建优先级队列,但有些东西不起作用。我了解优先级队列的一般功能,但在 java 方面我是一个完整的初学者。我查看了其他示例,但似乎找不到我的问题所在。有什么建议吗?我注意到的一件事是使用类型或其他什么,但我不确定那是什么。

头等舱:

public class Node {     //Node class structure

    int data;   //data contained in Node    
    Node next;  //pointer to Next Node

    public int getData() {
        return data;
    }
    public void setData(int data) {
        this.data = data;
    }
    public Node getNext() {
        return next;
    }
    public void setNext(Node next) {
        this.next = next;
    }

}

二等:

import work.Node;

//basic set-up of a singly linked list
public class SLList{

    Node head;  //head of SLList
    Node tail;  //tail of SLList
    int n;      //number of elements in SLList

}

第三类:

import work.Node;

public class PriorityQueue extends SLList{

//add a new node 
public void add(int x){
    Node y = new Node();
    y.data = x;

    if (tail == null){  //if there is no existing tail, thus an empty list
        tail = y;       //assign tail and head as new node y
        head = y;   
    }
    else if (y.data < head.data){   //if new node y is the smallest element, thus highest priority
        y.next = head;              //assign y's next to be current head of queue
        head = y;                   //reassign head to be actual new head of queue (y)
    }
    else{               //if there is already a tail node
        tail.next = y;  //assign the tail's pointer to the new node
        tail = y;       //reassign tail to actual new tail of queue (y)
    }   
    n++;                //increment the queue's size
}

//delete the minimim (highest priority value) from the queue
public Node deleteMin(){
    if (n == 0){            //if the list is of size 0, and thus empty
        return null;        //do nothing
    }
    else{                           //if there are node(s) in the list
        Node min = head;            //assign min to the head
        head = head.next;           //reassign head as next node,               
        n--;                        //decrement list size
        return min;             //return the minimum/highest priority value
    }       
}

//return the size of the queue
public int size() {
    return n;           
}
}

测试代码:

import work.Node;
import work.SLList;
import work.PriorityQueue;

public class Test {

public static void main(String[] args){
    PriorityQueue PQueue1 = new PriorityQueue();

    PQueue1.add(3);
    PQueue1.add(2);
    PQueue1.add(8);
    PQueue1.add(4);

    System.out.println("Test add(x): " + PQueue1);
    System.out.println("Test size() " + PQueue1.size());

    PriorityQueue PQueue2 = new PriorityQueue();
    PQueue2 = PQueue1.deleteMin();                //the data types don't line up but I don't know what should be changed

    System.out.println("Test deleteMin() " + PQueue2);
    System.out.println("Test size() " + PQueue2.size());
}   
}

【问题讨论】:

  • 您想将 PriorityQueue 类型的引用分配给 Node 类型的值,它们不会在一个类层次结构中发生事件。
  • “某事不工作”请明确。什么不工作?
  • 不要评论所有内容。 Node head - 是的,它是列表的首位。你不必用英文写。注释的目的不是将代码翻译成英文。您应该使用 cmets 来解释您所写内容背后的原因。不要将 size 变量声明为 int n 并在其旁边写注释,而是这样做:int size。它更加干净和明显。通过解释为什么会发生而不是发生什么来发表评论:)

标签: java linked-list nodes priority-queue


【解决方案1】:

测试类的代码

PQueue2 = PQueue1.deleteMin();                //this line isn't working*

由于类型不匹配,此行不起作用:您无法从 Node 转换为 PriorityQueue。

ClassCastException 的 API 规范:

抛出表明代码已尝试将对象强制转换为它不是实例的子类。例如,以下代码生成 ClassCastException:

在您的示例中,这将起作用;

Node node = PQueue1.deleteMin();              //this will work

【讨论】:

  • 我看到这是我尝试运行它时的原因,但我不确定如何纠正错误。应该使用不同的类(不是节点)创建 deleteMin() 还是?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多