232.用栈实现队列
语法
Stack<Integer> stackA = new Stack<>();
while (!stackB.isEmpty()){}
stackA.push(x);
stackA.pop();
注意类中的属性声明和初始化写法
Stack<Integer> stackA;
Stack<Integer> stackB;
public MyQueue() {
stackA = new Stack<>();
stackB = new Stack<>();
}
225.用队列实现栈
语法
Queue<Integer> queueA = new LinkedList<>();
queueA.add(x);
x = queueA.poll();
优化:可以使用一个queue实现
20.有效的括号
用一个栈也可以实现
遇到左括号,对应右括号进栈
遇到右括号,检查栈顶元素是否相等
查询栈顶元素
char c = stack.peek();
1047.删除字符串中的所有相邻重复项
拼接字符串时:
String str = "";
while(!deque.isEmpty()) {
str = deque.pop() + str;
}
150.逆波兰表达式求值
字符串匹配不能用“==”:
tokens[i].equals("+")
字符串转数字:
int a = Integer.parseInt(tokens[i]);
239.滑动窗口最大值
可以再做一遍
使用单调队列
- 队头元素不在窗口内弹出(while)
- 队尾元素小于当前遍历值弹出(while)
- 入队
- 形成窗口后每一轮的队头元素(最大值)计入结果数组
注意
ArrayDeque<Integer> deque = new ArrayDeque<>(); // 双端队列
deque.peek(); // 查询队头元素
deque.peekLast(); // 查询队尾元素
deque.poll(); // 弹出队头元素
deque.pollLast(); // 弹出队尾元素
deque.offer(i); // 添加到队列末尾,相比add超限不报错
347.前k个高频元素
可以再做一遍
这题有点难,想到用map但是想不到如何留下前k个
用小顶堆可以永远只排k个节点,大顶堆需要排全部且poll顶端元素后需要重新排序
注意语法,以大顶堆PriorityQueue为例:
// 比较器的逻辑是比较两个整型数组的第二个元素(索引为 1)的大小,第二个元素大的数组排在队列的前面,第二个元素相同时比较第一个元素。
PriorityQueue<int[]> pq = new PriorityQueue<>((pair1, pair2)->pair2[1]-pair1[1]);
// 大顶堆需要对所有元素进行排序
// Map.Entry可以遍历键值对
for (Map.Entry<Integer, Integer> entry:map.entrySet()) {
pq.add(new int[]{entry.getKey(), entry.getValue()});
}
区别:
- Stack
Stack<Integer> stack = new Stack<>();
stack.push(x);
stack.pop();
- Queue
Queue<Integer> queue = new LinkedList<>(); // LinkedList双向链表,提供add、poll等操作
queue.offer(x);
queue.poll(); // 队头
queue.peek(); // 栈顶
- Deque 双向队列,java官方文档推荐用Deque实现栈
Deque<Character> deque = new LinkedList<>();
deque.addFirst(); // 向队头插入元素,如果元素为空,则发生NPE(空指针异常)
deque.addLast(); // 向队尾插入元素,如果为空,则发生NPE
deque.offerFirst(); // 向队头插入元素,如果插入成功返回true,否则返回false
deque.offerLast(); // 向队尾插入元素,如果插入成功返回true,否则返回false
deque.removeFirst(); // 返回并移除队头元素,如果该元素是null,则发生NoSuchElementException
deque.removeLast(); // 返回并移除队尾元素,如果该元素是null,则发生NoSuchElementException
deque.pollFirst(); // 返回并移除队头元素,如果队列无元素,则返回null
deque.pollLast(); //返回并移除队尾元素,如果队列无元素,则返回null
deque.getFirst(); // 获取队头元素但不移除,如果队列无元素,则发生NoSuchElementException
deque.getLast(); //获取队尾元素但不移除,如果队列无元素,则发生NoSuchElementException
deque.peekFirst(); // 获取队头元素但不移除,如果队列无元素,则返回null
deque.peekLast(); // 获取队尾元素但不移除,如果队列无元素,则返回null
deque.pop(); //弹出栈中元素,也就是返回并移除队头元素,等价于removeFirst(),如果队列无元素,则发生NoSuchElementException
deque.push(); //向栈中压入元素,也就是向队头增加元素,等价于addFirst(),如果元素为null,则发生NPE,如果栈空间受到限制,则发生IllegalStateException
- ArrayDeque双端队列
ArrayDeque<Integer> deque = new ArrayDeque<>(); // 双端队列
deque.peek(); // 查询队头元素
deque.peekLast(); // 查询队尾元素
deque.poll(); // 弹出队头元素
deque.pollLast(); // 弹出队尾元素
deque.offer(i); // 添加到队列末尾,相比add超限不报错