Java数据结构与算法笔记——优先级队列

文章目录

优先级队列介绍

普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。
在优先队列中,元素被赋予优先级。在插入元素时,要按照优先级找到正确的位置并插入。

实现一个简单的优先级队列

数值的大小作为优先级,数值越大优先级越高。
插入:根据元素的大小插入。
取出:取出队头元素。

在这里插入代码片package queue;

public class QueueTest3 {
    public static void main(String[] args) {
        PriorityQueue queue = new PriorityQueue(3);
        queue.insert(1);
        queue.insert(100);
        queue.insert(23);
        queue.insert(25);

//        System.out.println(queue.peek());

        while (!queue.isEmpty()){
            System.out.println(queue.removeHeader());
        }
    }
}


class PriorityQueue{
    private int[] elements;
    private int maxSize;
    private int nElems;

    public PriorityQueue(int size){
        elements = new int[size];
        maxSize = size;
        nElems = 0;
    }

    //插入数据
    public void insert(int data){
        if(nElems==0){//空队列
            elements[nElems++] = data;
        } else if(nElems != maxSize){
            int j = nElems-1;
            while(j>=0 && data>elements[j]){
                //队列从大到小排序,所以从后向前遍历队列,如果队列中的元素比data小,就把元素往后移动
                elements[j+1] = elements[j];
                j--;
            }
            elements[j+1] = data;
            nElems ++;
        }
    }

    //读队尾数据
    public int peek(){
        if(nElems != 0){
            return elements[nElems-1];
        }else{
            return -1; //我们设定-1表示没数据
        }
    }

//    //取出数据,取出队尾的一个元素
//    public int remove(){
//        int removeData = -1;
//        if(nElems != 0){
//            removeData = elements[nElems-1];
//            elements[nElems-1] = -1;//-1表示没有元素
//            nElems--;
//        }
//        return removeData;
//    }

    //取出数据,取出队头的一个元素
    public int removeHeader(){
        int removeData = -1;
        if(nElems != 0){
            removeData = elements[0];
            for(int i=0;i<nElems-1;i++){
                elements[i] = elements[i+1];
            }
            elements[nElems-1] = -1;//-1表示没有元素
            nElems--;
        }
        return removeData;
    }


    //判断是否为空
    public boolean isEmpty(){
        return (nElems == 0);
    }

}
上一篇:copyonwritearraylist


下一篇:服务器三大体系SMP、NUMA、MPP介绍