栈
java.util;
Stack 类表示后进先出(LIFO)对象堆栈。 它使用五个操作扩展了类Vector,这些操作允许将向量视为堆栈。
Stack stack = new Stack<>(); //新建堆栈
stack.push(1) ; //向stack栈顶压入一个元素
stack.pop() ; //从stack中弹出栈顶元素
stack.peek() ; //查看stack中栈顶元素,不弹出
stack.empty() ; //判断stack是否是空栈
stack.search(2) ; //若该对象存在,返回对象在此堆栈上的从1开始的位置。
// 栈顶元素为对象时,返回1//若不存在,则返回-1,
Deque接口及其实现提供了一套更完整,更一致的LIFO堆栈操作,应优先使用此类。
(Deque意为双端队列,double ended queue)。具体来说又有ArrayDeuqe和LinkedList两种具体类来实现,两者的区别体现在底层分别使用数组和链表来实现。
LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。
LinkedList 实现 List 接口,能对它进行队列操作。
实现Deque接口,即能将LinkedList当作双端队列使用。
当LinkedList被当做栈来使用时,常用api及对应关系如下:
栈方法 等效方法
push(e) addFirst(e)
pop() removeFirst()
peek() peekFirst()
empty() isEmpty() //判断是否为空
队列
java中虽然有Queue接口,单java并没有给出具体的队列实现类,而Java中让LinkedList类实现了Queue接口,所以使用队列的时候,一般采用LinkedList。因为LinkedList是双向链表,可以很方便的实现队列的所有功能。
Queue使用时要尽量避免Collection的add()和remove()方法,而是要使用offer()来加入元素,使用poll()来获取并移出元素。它们的优点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常。 如果要使用前端而不移出该元素,使用element()或者peek()方法。
java中定义队列 一般这样定义: Queue queue = new LinkedList();
当采用LinkedList来实现时,api的使用和对用关系如下:
队列方法 等效方法
offer(e) offer(e)/offerLast(e) //进队列,将元素加入队列末尾
poll() poll()/pollFirst() //获取队列头的元素并移除
peek() peek()/peekFirst() //获取队列头的元素 isEmpty() //判断是否为空
Queue queue = new LinkedList<>();
queue.element();
queue.offer(1);
queue.poll();
queue.peek();
双向队列
Deque deque = new LinkedList<>();
deque.offer(1);
deque.offer(2);
deque.offerFirst(3);
deque.pollLast();
小根堆
PriorityQueue类实现了优先队列,默认是一个小根堆的形式,如果要定义大根堆,需要在初始化的时候加入一个自定义的比较器。
PriorityQueue 实现heap
minHeap:PriorityQueue默认实现小根堆
PriorityQueue minHeap = new PriorityQueue<>();
minHeap.offer(8);
minHeap.offer(5);
minHeap.offer(3);
minHeap.offer(4);
minHeap.offer(2);while(!minHeap.isEmpty()) {
System.out.println(minHeap.poll());
}
class maxComparator implements Comparator{
@Overridepublic intcompare(Integer num1, Integer num2) {return num1 >= num2 ? -1 : 1;
}
}
PriorityQueue maxHeap = new PriorityQueue<>(newmaxComparator());
maxHeap.offer(5);
maxHeap.offer(3);
maxHeap.offer(4);
maxHeap.offer(1);
maxHeap.offer(2);while(!maxHeap.isEmpty()) {
System.out.println(maxHeap.poll());
}
TreeSet