【Queue】
先进先出(First-In-First-Out),LinkedList实现了Queue接口。它只允许在表的前端进行删除操作,而在表的后端进行插入操作。
add() 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常
remove() 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
element() 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
offer() 添加一个元素并返回true 如果队列已满,则返回false
poll() 移除并返问队列头部的元素 如果队列为空,则返回null
peek() 返回队列头部的元素 如果队列为空,则返回null
put() 添加一个元素 如果队列满,则阻塞
take() 移除并返回队列头部的元素 如果队列为空,则阻塞
boolean isEmpty() 判断队列是否为空
size() 返回队列长度
时间复杂度分析:
O(1) Push / O(1) Pop / O(1) Top
PriorityQueue
默认为最小堆,可以用比较器构造最大堆
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(k, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2 - o1; } });
【Stack】
boolean empty() 测试堆栈是否为空。
Object peek() 查看堆栈顶部的对象,但不从堆栈中移除它。
Object push() 移除堆栈顶部的对象,并作为此函数的值返回该对象。
Object pop() 把项压入堆栈顶部。
时间复杂度:
O(1) Push / O(1) Pop / O(1) Top
【Heap】
Heap 是一种二叉树(binary tree), 说得再准确一点, 它是一种完全二叉树(complete binary tree)。
对于一个完全二叉树, 没有必要用常规的树结构(使用指针)来表示, 因为如果从上到下走过每层(每层内从左到右)给所有节点编号。(根节点的编号为0)的话, 完全二叉树有以下特征:father(i) = i/2
其中father(i)表示编号为i的节点的父节点的下标;leftchild(i) = i*2+1, rightchild(i) = i*2+2。所以使用数组就可以进行存储。
最小堆:父结点的值小于两个左右结点的值;最大堆:父结点的值大于两个左右结点的值。
复杂度总结:
add - O(logN)
poll - O(logN)
top - O(1)