//修改 linkedList 实现的 deque api
//push 实际上相当于addFirst(linkFirst) 从头部插入
//pop 实际上相当于removeFirst 空集合时抛异常
//poll 实际上相当于unLinkFirst 空集合时返回null
// peek 空集合时返回null getFirst空集合时抛出异常
//将课程上的代码修改后如下:
Deque<String> deque = new LinkedList<String>();
deque.addFirst(“a”);
deque.addFirst("b");
deque.addFirst("c");
System.out.println(deque);
String str = deque.getFirst(();
System.out.println(str);
System.out.println(deque);
while (deque.size() > 0) {
System.out.println(deque.removeFirst());
}
System.out.println(deque);
Queue作为队列的接口,常用的几个api有add、offer、remove、poll、element、remove,add添加空元素会抛异常,offer会返回false,remove空集合时会返回异常,poll空集合时返回null;
PriorityQueue:
入队元素需要实现Comparator接口,元素的大小比较方法可以由用户Comparator指定。
在查看PriorityQueue的实现前需要先了解java实现优先队列所用的数据接口二叉堆。
首先是堆这种数据结构的特点:
(1)堆中某个节点的值总是不大于或不小于其父节点的值;
(2)堆总是一棵完全树。
常见的堆有二叉堆、斐波那契堆等。
PriorityQueue使用的便是二叉堆中的最小堆。最小堆,即父结点的键值总是小于或等于任何一个子节点的键值。
PriorityQueue使用的是基于数组实现的二叉堆,对于数组中任意位置的n上元素,其左孩子在[2n+1]位置上,右孩子[2(n+1)]位置,它的父亲则在[n-1/2]上,而根的位置则是[0]。
PriorityQueue中构造方法、添加元素方法、和删除元素方法都需要维护二叉堆的相对顺序,进行heapify、上浮或者下移。