Java 队列

Queue

LinkedList 既
1.有栈的 pop,push 方法
2.有队列的 offer,poll 方法
3.有deque的 addfirst,addLast,removeFirst, removeLast 方法
4.有collection 都有的 add,remove 方法
5.有 栈和堆的 peek 方法
所以实际上LinkedList 既是栈,又是堆,还是双向队列。

  • Queue
    • PriorityQueue
    • LinkedList
    • ArrayDeque

LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。

LinkedList:底层使用双向链表存储,对于频繁的插入、删除操作效率更高

//add()和remove()方法在失败的时候会抛出异常(不推荐)
 Queue<String> queue = new LinkedList<String>();

queue.offer("a");//添加元素
queue.poll();//第一个元素出队列,poll() 方法在用空集合调用时不是抛出异常,只是返回 null
queue.peek());//获得队首元素,不出队列。在队列为空时,peek() 返回 null。

PriorityQueue优先队列

不过区别在于优先队列的出队操作出队的是优先级最高的元素。

思路:收集数据 + 数据排序,加一个元素排一次序(这里并不是所有元素都排序,二叉树的部分分支进行排序),最终得到一个完全二叉树,根节点是最小元素,算法将会把最小元素永远放到树顶,每次也只会取根节点的元素,也就是每取一次数据,若数据被拿出,则自动重新排序,将根节点再次变为最小的。

内部是用heap实现的,基于堆的完全二叉树,并不是真正的队列。

默认是升序排列

//降序排列
PriorityQueue<Integer> q = new PriorityQueue<>((o1,o2)->o2-o1);

常用方法

常用方法 方法1 方法2
将元素入队 add()
Queue接口规定插入失败抛出异常
add()其实调用了offer()
offer()
Queue接口规定插入失败返回false
查看队头元素 element()
失败抛出异常
peek()
失败返回false
将队首元素出队 remove()
该方法不是Queue接口内的方法,而是Collection接口的方法。
所以remove(Object o)还可以删除堆中的与给定对象相同的最先出现的对象
poll()
返回队列元素个数 size()
判断队列是否为空 isEmpty()

遍历

加强for循环,不保证输出顺序。

for (Event e : pq)

PriorityQueue方法iterator()中不保证以任何特定顺序遍历队列元素。堆仅部分排序,最小的元素位于根。

Iterator it = pq.iterator();
while(it.hasNext()){
System.out.print(it.next());
}

有序遍历,将优先队列转化成数组再排序Arrays.Sort(pq.toArray()。

注意点
1.优先队列不允许空值
2.PriorityQueue要么存储的是实现了Comparable接口的元素,要么在构造函数中传入一个Comparator对象。
3.PriorityQueue方法iterator()中提供的迭代器并不保证以有序的方式遍历优先级队列中的元素。

关于堆排序的笔记

posted @ 2021-11-18 16:00  rananie  阅读(113)  评论(0编辑  收藏  举报