为什么此优先级队列实现只重复打印一个值?

时间:2016-02-08 06:17:18

标签: stack priority-queue

此程序应按升序排列值。但它只重复显示957.0。如何按顺序显示数字?

import java.io.*;
import java.util.*;


class PriorityQ {
    public int maxSize;
    public double[] queArray;
    public int nItems;
    //------
    public PriorityQ(int s){
        maxSize = s;
        queArray = new double[maxSize];
        nItems = 0;
    }
    //-----
    public void insert(double item){
        int j;

        if(nItems == 0){
            queArray[nItems++] = item;
        }
        else{
            for(j = nItems-1; j >= 0; j--){
                if(item > queArray[j]){
                    queArray[j + 1] = item;
                }
                else{
                    break;
                }
            }
        queArray[j + 1] = item;
        nItems++;
        }
    }

    //-----
    public double remove(){
        return queArray[--nItems];
    }
    //-----
    public double peekMin(){
        return queArray[nItems - 1];
    }
    //-----
    public boolean isEmpty(){
        return(nItems == 0);
    }
    //-----
    public boolean isFull(){
        return(nItems == maxSize);
    }
}
    //-----


    public class PriorityQApp{
        public static void main(String[] args) throws IOException{
            PriorityQ thePQ = new PriorityQ(5);
            thePQ.insert(546);
            thePQ.insert(687);
            thePQ.insert(36);
            thePQ.insert(98);
            thePQ.insert(957);

            while(!thePQ.isEmpty()){
                double item = thePQ.remove();
                System.out.print(item + " ");
            }
            System.out.println("");
        }
    }

1 个答案:

答案 0 :(得分:-1)

您应该省去自己的努力,并使用priority queue与通用类型Double。如果你想降序,你甚至可以使用一个在最低值之前订购最高值的比较器,但是你要求提升。

您的问题是您的阵列确实包含许多957的副本。 这是因为代码中的这一行:

if(item > queArray[j]){
    queArray[j + 1] = item;
}

尝试:

import java.io.*;
import java.util.*;

public class PriorityQApp{
    public static void main(String[] args) throws IOException{
        PriorityQueue<Double> thePQ = new PriorityQueue<Double>(5);
        thePQ.add(546);
        thePQ.add(687);
        thePQ.add(36);
        thePQ.add(98);
        thePQ.add(957);

        while(thePQ.size() > 0){
            double item = thePQ.poll();
            System.out.print(item + " ");
        }
        System.out.println("");
    }
}

或者我可以修改你的代码以降序打印出队列,然后让它按升序打印出来,我之前指出的块应该是这样的:

if(item < queArray[j]){
    queArray[j + 1] = queArray[j];
}