一.栈 Stack
1.1 概念
- 栈是一种线性数据结构,遵循先进后出 FILO(First In Last Out)
- 只能在一端(栈顶)进行插入、删除
1.2 常用用法
常用操作:
- 入栈:stack.push()
- 出栈:stack.pop()
- 查看栈顶元素:stack.peek()
- 判空:stack.isEmpty()
注意:空栈的话pop/peek会抛异常,使用前isEmpty()
LinkedList实现栈
Deque<Integer> stack = new LinkedList<>();
stack.push(10); // 压入元素
stack.pop(); // 弹出元素
适用场景:适用于对栈操作的基本需求,支持在栈顶进行插入和删除
ArrayDeque实现栈(常用)
ArrayDeque<Integer> stack = new ArrayDeque<>();
stack.push(10); // 压入元素
stack.pop(); // 弹出元素
适用场景:相比较LinkedList,ArrayDeque的性能通常更优,适用于频繁操作栈顶的场景
二.队列 Queue
1.1 概念
- 队列是一种线性数据结构,遵循先进先出 FIFO(First In First Out)
- 在两端操作:队尾入队,队头出队
1.2 常用用法
常用用法:
- 入队:queue.offer()
- 出队:queue.poll() 空队列返回null
- 查看队头元素:queue.peek() 空队列返回null
- 判空:queue.isEmpty()
LinkedList实现队列:
Queue<Integer> queue = new LinkedList<>();
queue.offer(10); // 入队
queue.poll(); // 出队
适用场景:适合队列操作,可以灵活的进行队列的头尾插入和删除
ArrayDeque实现队列
ArrayDeque<Integer> queue = new ArrayDeque<>();
queue.offer(10); // 入队
queue.poll(); // 出队
适用场景:ArrayDeque性能更好,适合需要高效入队和出队的场景
三.双端队列
Deque是双端队列(Double-ended Queue)的简称,支持从两端插入和删除元素。Deque既可以作为栈使用,也可以作为队列使用。
LinkedList实现双端队列:
Deque<Integer> deque = new LinkedList<>();
deque.addFirst(10); // 在头部插入元素
deque.addLast(20); // 在尾部插入元素
deque.removeFirst(); // 从头部移除元素
deque.removeLast(); // 从尾部移除元素
使用场景:需要从两端进行插入和删除操作时使用,如实现双向队列、回退栈等
ArrayDeque实现双端队列
ArrayDeque<Integer> deque = new ArrayDeque<>();
deque.addFirst(10); // 在头部插入元素
deque.addLast(20); // 在尾部插入元素
deque.removeFirst(); // 从头部移除元素
deque.removeLast(); // 从尾部移除元素
适用场景:适用需要从两端快速插入和删除元素的场景,性能更好,适用于高效的双端队列操作
代码随想录LeetCode题目:
1.删除字符串中的所有相邻重复项
1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)
2.逆波兰表达式求值
逆波兰表达式,也就是后续表达式(经典)
- 如果遇到操作数,则将操作数入栈;
- 如果遇到运算符,则将两个操作数出栈,其中先出栈的是右操作数,后出栈的是左操作数,使用运算符对两个操作数进行运算,将运算得到的新操作数入栈;
- 遍历完成后,栈内只有一个元素,该元素即为逆波兰表达式的值。
3.有效括号匹配 经典