Collection之双端队列与优先级队列(Priority queue)

双端队列

在Java SE6中,引入了Deque接口,并由ArrayDeque和LinkedList两个类实现,都提供了双端队列,并且可以在必要时增加队列的长度,不支持在队列中间添加元素。

Priority queue

优先级队列中的元素可以按照任意的顺序插入,却总是按照排序的顺序进行检索,无论何时调用remove方法,总会获得当前优先级队列中最小的元素。优先级队列并没有对所有的元素进行排序,而是使用了数据结构中的堆(heap),heap是一个可以自我调整的二叉树,对树执行add和remove操作,可以让最小的元素移动到根,而不必花费时间对元素进行排序。

使用优先级队列的典型示例是任务调度,每一个任务有一个优先级,任务以随机顺序添加到队列中,每当启动一个新任务时,都将优先级最好的任务从队列中删除(习惯将1设为“最高”,所以会将最小的元素删除)

下面程序显示了一个正在运行的优先级队列,与TreeSet中的迭代不同,这里的迭代并不是按照元素的排列顺序访问的,而删除却总是删掉剩余元素中优先级最小的元素。

public class PriorityQueueTest
{
   public static void main(String[] args)
   {
      PriorityQueue<GregorianCalendar> pq = new PriorityQueue<GregorianCalendar>();
      pq.add(new GregorianCalendar(1906, Calendar.DECEMBER, 9)); // G. Hopper
      pq.add(new GregorianCalendar(1815, Calendar.DECEMBER, 10)); // A. Lovelace
      pq.add(new GregorianCalendar(1903, Calendar.DECEMBER, 3)); // J. von Neumann
      pq.add(new GregorianCalendar(1910, Calendar.JUNE, 22)); // K. Zuse

      System.out.println("Iterating over elements...");
      for (GregorianCalendar date : pq)
         System.out.println(date.get(Calendar.YEAR));
      System.out.println("Removing elements...");
      while (!pq.isEmpty())
         System.out.println(pq.remove().get(Calendar.YEAR));
   }
}

 

 

你可能感兴趣的:(数据结构,J#)