代码随想录——栈与队列 刷题记录

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超限不报错
  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值