目录
本文总结了Java提供的堆栈(Stack)、队列(Queue)和优先队列(PriorityQueue)的使用。
堆栈(Stack)——后进先出模型
堆栈为后进先出模型:
以存储String类型为例:
Stack<String> stack = new Stack<>();
常用方法:
// 判断堆栈是否为空
stack.isEmpty();
// 只读栈顶元素,但不弹出
stack.peek();
// 弹出栈顶元素
stack.pop();
// 栈顶推入元素
stack.push(E e);
队列(Queue)——先进先出模型
队列为先进先出模型:
以存储String类型为例:
// Queue 是接口,无法直接实例化,LinkedList 实现了 Queue 接口
Queue<String> queue = new LinkedList<>();
常用方法:
// 判断队列是否为空
queue.isEmpty();
// 只读队头元素,但不弹出
queue.peek();
// 输出队头元素,并删除该元素
queue.poll();
// 从队尾插入元素
queue.offer(E e);
优先队列(PriorityQueue)
以存储String类型为例:
PriorityQueue<String> priorityQueue = new PriorityQueue<>();
常用方法:
// 判断队列是否为空
priorityQueue.isEmpty();
// 只读队头元素,但不弹出
priorityQueue.peek();
// 输出队头元素,并删除该元素
priorityQueue.poll();
// 从队尾插入元素
priorityQueue.offer(E e);
优先队列与普通队列常用方法相似,区别在于优先队列默认情况下是一个 最小优先队列,每插入一个元素,会将所有元素按 升序 排列,队列头部为 最小 的元素。
优先队列可以在实例化时通过匿名函数更改默认比较方式,举例设计 最大优先队列:
// 通过比较器将排列顺序改为降序,即队列头部存储最大元素
PriorityQueue<String> priorityQueue = new PriorityQueue<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.compareTo(o1);
}
});
优先队列使用注意事项:
1、优先队列每插入一个元素都会执行比较器中的比较方法,当队列元素越来越多时,添加操作的效率会越来越低,需要按照实际需求控制好队列的元素数量;
如:获取队列中 最小的3个元素,则需要设计 最大优先队列,当队列中存第4个元素开始,执行进1出1,进一个元素,队列执行排序,排序后将队列头部的最大元素取出,以此循环,最后队列中剩的就是最小的3个元素;
2、优先队列中 不能插入null元素,因为null无法参与比较,元素插入前需要判断是否为null。