上一篇:线性结构之数组和链表
1. 栈和队列
栈: 先进后出(FILO - first in last out):最先插入的元素最后出来。
队列:先进先出(FIFO - first in first out):最先插入的元素最先出来。
图示:
2. 栈和队列在java中的实现
在java中栈是用Stack实现的,Stack继承自Vector;也可以使用LinkedList,ArrayDeque
实现栈功能先进后出操作
使用java中的集合类,实现栈的操作
使用Stack来实现栈的操作
Stack<String> stringStack = new Stack<>();
stringStack.push("aaa");
stringStack.push("bbb");
String s = stringStack.pop();
使用LinkedList来实现栈的操作
LinkedList<String> stringStack = new LinkedList<>();
//选择下面一套不要混用
//第1套组合
stringStack.push("aaa");
stringStack.push("bbb");
String s1 = stringStack.pop();
//第2套组合
stringStack.addFirst("aaa");
stringStack.addFirst("bbb");
String s2 = stringStack.removeFirst();
//第3套组合
stringStack.addLast("aaa");
stringStack.addLast("bbb");
String s3 = stringStack.removeLast();
//还有其他组合,LinkedList继承Deque,实现了从头或者尾添加和移除元素
栈的运用场景
- 反转操作,如链表的反转,字符串的反转
- 树基于栈的先序、中序、后序遍历
实现队列功能先进先出操作
使用LinkedList来实现队列的操作
LinkedList<String> stringLinkedList = new LinkedList<>();
stringLinkedList.add("aaa");
stringLinkedList.add("bbb");
String s = stringLinkedList.poll();
//还有其他组合,LinkedList继承Deque,实现了从头或者尾添加和移除元素
优先对列(堆)
堆的概念
堆(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:
- 堆中某个节点的值总是不大于或不小于其父节点的值;
- 堆总是一棵完全二叉树。
将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。
java中PriorityQueue(堆)的使用
- 使用根节点性质:最小堆根节点永远是最小的;反之,最大堆根节点永远是最大的。这样在一个PriorityQueue队列中取出根节点的数据就是最大或者最小的,有优先级的。
//默认排序是最小堆
PriorityQueue<Integer> integerPriorityQueue = new PriorityQueue<>();
integerPriorityQueue.add(2);
integerPriorityQueue.add(-1);
integerPriorityQueue.add(3);
integerPriorityQueue.add(1);
integerPriorityQueue.add(5);
while (integerPriorityQueue.size() > 0) {
Integer integer = integerPriorityQueue.poll();
Log.e(TAG, "integer-->" + integer.toString());
}
//自定义排序,使用下面的
public PriorityQueue(Comparator<? super E> comparator) {
this(DEFAULT_INITIAL_CAPACITY, comparator);
}
- k 个元素的最大堆,根节点是第k小的;k个元素的最小堆,根节点是第k大的,使用这个性质,解决这类问题,在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
//优先队列
public static int findKthLargest(int nums[], int k) {
PriorityQueue<Integer> heap = new PriorityQueue<>();
for (int num : nums){
if (heap.size()<k){
heap.add(num);
}else if (heap.peek() < num){
heap.poll();
heap.add(num);
}
}
return heap.poll();
}
java中ArrayDeque,LinkedList的使用
ArrayDeque使用数组实现的Deque双端队列,实现了从头或者尾添加和移除元素,可以用来实现栈和队列操作
LinkedList是使用链表实现的Deque双端队列,实现了从头或者尾添加和移除元素,可以用来实现栈和队列操作
上一篇:线性结构之数组和链表
此文要是对你有帮助,如果方便麻烦点个赞,谢谢!!!