java使用数组实现优先级队列

1.1.  优先级队列的数据结构

如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了。这样,我们就引入了优先级队列这种数据结构。 优先级队列(priorityqueue)是0个或多个元素的集合,每个元素都有一个优先权,对优先级队列执行的操作有(1)查找(2)插入一个新元素(3)删除一般情况下,查找操作用来搜索优先权最大的元素,删除操作用来删除该元素。对于优先权相同的元素,可按先进先出次序处理或按任意优先权进行。

1.2.  Java实现


PriorityQueueTest

package ch04;

public class PriorityQueueTest {

    public static void main(String[] args) {

       PriorityQueue queue = new PriorityQueue(10);
       System.out.println("isEmpty: " + queue.isEmpty());
       for (int i = 0; i < 10; i++) {
           queue.insert(i);
       }
       System.out.println("isFull: " + queue.isFull());

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

}

class PriorityQueue {
    private int[] arrInt;// 内置数组
    private int nItems;// 数组中元素个数

    public PriorityQueue(int size) {
       this.arrInt = new int[size];
       nItems = 0;
    }

    /**
     * 判断优先级队列是否为空
     *
     * @return
     */
    public boolean isEmpty() {
       return 0 == nItems;
    }

    /**
     * 判断优先级队列是否已满
     *
     * @return
     */
    public boolean isFull() {
       return nItems == arrInt.length;
    }

    /**
     * 向优先级队列中插入一个元素
     *
     * @param item
     */
    public void insert(int item) {

       if (isFull()) {
           throw new RuntimeException("优先级队列已满");
       }

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

    }

    /**
     * 获得优先级队列优先级最高的元素
     *
     * @return
     */
    public int peek() {
       return arrInt[nItems - 1];
    }

    /**
     * 从优先级队列中移除一个元素
     *
     * @return
     */
    public int remove() {
       if (isEmpty()) {
           throw new RuntimeException("优先级队列为空");
       }
       return arrInt[--nItems];
    }
}

运行结果如下:

isEmpty: true

isFull: true

0

1

2

3

4

5

6

7

8

9

时间: 2024-10-12 20:24:51

java使用数组实现优先级队列的相关文章

Java用数组实现循环队列

复习了下数据结构,用Java的数组实现一下循环队列. 队列的类 1 //循环队列 2 class CirQueue{ 3 private int QueueSize; 4 private int front; 5 private int rear; 6 private int[] queueList ; 7 8 public CirQueue(int QueueSize){ 9 this.QueueSize = QueueSize; 10 queueList = new int[QueueSiz

java PriorityBlockingQueue 基础的优先级队列,可阻塞的读取操作.

package org.rui.thread.newc; import java.util.ArrayList; import java.util.List; import java.util.Queue; import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.PriorityB

JAVA优先级队列测试

package code.test; import java.util.Comparator; import java.util.Iterator; import java.util.PriorityQueue; import java.util.Queue; /** * 实验表明,在java中: * 1.优先级队列打印或者迭代,得到的输出顺序为堆结构数组的顺序,大致有序但不完全保证顺序 * 2.由于堆排序是不稳定排序,在优先级相同的情况下,元素不会保持原来的顺序输出 * Created by

java面向对象的栈 队列 优先级队列的比较

栈 队列 有序队列数据结构的生命周期比那些数据库类型的结构(比如链表,树)要短得多.在程序操作执行期间他们才被创建,通常用他们去执行某项特殊的任务:当完成任务之后,他们就会被销毁.这三个数据结构还有一个特点就是访问是受到限制的,即在特定时刻只有一个数据项可以被读取或者被删除,但是所谓的移除并不是真的删除,数据项依然在这些数据结构中,只不过因为指针已经指向其他数据项,没有办法访问到,当添加新的数据项时,当初移除的数据项被替代从而永远消失. 栈 队列 优先级队列的模拟思想 1.栈:栈遵循先进后出(F

教你如何使用Java手写一个基于数组实现的队列

一.概述 队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表.在具体应用中通常用链表或者数组来实现.队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作.队列的操作方式和堆栈类似,唯一的区别在于队列只允许新数据在后端进行添加. 在Java中队列又可以分为两个大类,一种是阻塞队列和非阻塞队列. 1.没有实现阻塞接口: 1)实现java.util.Queue的LinkList, 2)实现java.util.Abstra

【转】java中PriorityQueue优先级队列使用方法

优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最高优先权的元素. PriorityQueue是从JDK1.5开始提供的新的数据结构接口. 如果不提供Comparator的话,优先队列中元素默认按自然顺序排列,也就是数字默认是小的在队列头,字符串则按字典序排列. 由于网上的资料大多将优先级队列各个方法属性,很少有实例讲解的,为方便大家以后使用,我就写了个demo~ 如果想实现按照自己的意愿进行优先级排列的队列的话,需要实现Comparator接口.下面的方法,实现了根据某个变

《转》JAVA中PriorityQueue优先级队列使用方法

该文章转自:http://blog.csdn.net/hiphopmattshi/article/details/7334487 优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最高优先权的元素. PriorityQueue是从JDK1.5开始提供的新的数据结构接口. 如果不提供Comparator的话,优先队列中元素默认按自然顺序排列,也就是数字默认是小的在队列头,字符串则按字典序排列. 由于网上的资料大多将优先级队列各个方法属性,很少有实例讲解的,为方便大家以后使用,我就

java 队列、优先级队列、双向队列示例演示代码

package org.rui.collection2.queues; import java.util.LinkedList; import java.util.PriorityQueue; import java.util.Queue; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.Li

Java优先级队列PriotyQueue

优先级队列,顾名思义,和传统"先进后出"的队列相比,优先级队列在元素加入时就根据该元素的优先级插入到相应位置.实际上优先级队列PriotyQueue在poll时还是遵循先进后出,只是数据在进入时已经根据优先级排序了.实现优先级队列需要实现一个Comparator,测试代码如下: public class PriotyQueueTest { //比较器,用于判断两个元素的优先级 Comparator<Man> t = new Comparator<Man>() {