将优先级队列实现为堆栈Java

时间:2018-03-02 02:35:49

标签: java stack queue implementation priority-queue

我已经实施了我的计划,但我收到了例外java.lang.ClassCastException

这是代码:

import java.util.NoSuchElementException;

public class BasePQStack<Item> implements Stack<Item> {

// TODO: implement this object.
private int N = 0;
private MaxPQ<Compare> pq = new MaxPQ<>();
private int count;

public BasePQStack() {
    count = 0;

}

/**
 * entry point for sample output..
 * 
 * @param args
 */
public static void main(String[] args) {
    Stack<Integer> S = new BasePQStack<Integer>();

    S.push(new Integer(2));
    S.push(new Integer(7));
    Integer W = S.pop();
    S.push(new Integer(8));
    S.push(new Integer(5));
    ;
    Integer X = S.pop();
    Integer Y = S.peek();
    S.push(new Integer(3));
    Integer Z = S.pop();

    System.out.println("Testing: ");
    System.out.println(W);
    System.out.println(X);
    System.out.println(Y);
    System.out.println(Z);
}

@Override
public Item push(Item item) {
    Compare x = new Compare(item, count);
    pq.insert(x);
    count++;
    N++;

    return item;
}

@Override
public Item pop() {
    if (isEmpty())
        throw new NoSuchElementException("no such element");

    else {
        Item var = (Item) pq.delMax();
        N--;
        return var;
    }
}

@Override
public Item peek() {
    if (isEmpty())
        throw new NoSuchElementException("no such element");

    else {
        Item var = (Item) pq.delMax();
        push(var);
        return var;
    }

}

@Override
public boolean isEmpty() {
    return N == 0;
}

@Override
public int size() {
    return N;
}

public class Compare implements Comparable<Compare> {
    private Item value;
    private int a;

    public Compare(Item value, int a) {
        this.a = a;
        this.value = value;
    }

    @Override
    public int compareTo(Compare x) {
        if (this.a > x.a)
            return 1;
        if (this.a < x.a)
            return -1;
        else
            return 0;
    }

    public int getA() {
        return this.a;
    }

    public Item getValue() {
        return this.value;
    }

    @Override
    public String toString() {
        return "item {" + "value = " + value + ",a = " + a + '}';
    }
}

}

我从控制台获得的消息是BasePQStack $ Compare无法转换为java.lang.Integer。我试图做很多演员但却无法解决任何事情,因为它只会导致更多错误

代码的输出应为:

7

5

8

3

3 个答案:

答案 0 :(得分:0)

Java documentation:抛出类转换异常,表示代码已尝试将对象强制转换为不是实例的子类。“

从您发布的代码中,当您尝试向项目投射内容时,它可能会发生:

Item var = (Item) pq.delMax();

可能是因为您的队列不包含Item类型的对象,它包含Compare类型的对象。通常在你决定向下转换时要小心,因为编译器错误可以帮助你。

答案 1 :(得分:0)

您的MaxPQ键的类型为比较,当您按下整数时,它会在插入MaxPQ之前被包裹在比较中。

问题是当你弹出或偷看时你不做任何展开比较以回到整数。这就是您在调用pop()peek()的任何行上获得ClassCastException的原因。您将Compare视为整数。

您需要修改pop()peek()方法,如下所示;

    @Override
    public Item pop() {
            if (isEmpty()) {
                    throw new NoSuchElementException("no such element");
            } else {
                    Item var = (Item) pq.delMax().getValue();
                    N--;
                    return var;
            }
    }

    @Override
    public Item peek() {
            if (isEmpty()) {
                    throw new NoSuchElementException("no such element");
            } else {
                    Item var = (Item) pq.delMax().getValue();
                    push(var);
                    return var;
            }
    }

请注意getValue()的使用。这就是我上面提到的解包,即它为你提供了比较的整数。

答案 2 :(得分:0)

您应该替换此行

Item var = (Item) pq.delMax().getValue();

使用

delMax()

因为R.java:530: error: unknown tag: colgroup * <colgroup align="left" /> ^ 返回一个比较对象而你需要一个Item对象。