懒人速刷之java栈和队列

栈和队列

简介

栈的特点是后入先出

根据这个特点可以临时保存一些数据,之后用到依次再弹出来,常用于树的非递归遍历、 DFS 深度搜索。

队列常用于BFS广度搜索,很少单独考察。

基本应用

逆波兰表达式求值

150. 逆波兰表达式求值

波兰表达式计算 > 输入: ["2", "1", "+", "3", "*"] > 输出: 9

解释: ((2 + 1) * 3) = 9

public int evalRPN(String[] tokens) {
    Stack<Integer> stack = new Stack<>();
    for (String s : tokens) {
        if ("+".equals(s) || "-".equals(s) || "*".equals(s) || "/".equals(s)) {
            int a = stack.pop();
            int b = stack.pop();
            if ("+".equals(s)) stack.push(b + a);
            else if ("-".equals(s)) stack.push(b - a);
            else if ("*".equals(s)) stack.push(b * a);
            // 注意:b为被除数,a为除数
            else if ("/".equals(s)) stack.push(b / a);
        } else {
            // 转为数字
            stack.push(Integer.parseInt(s));
        }
    }
    return stack.pop();
}

有效的括号

20. 有效的括号

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。

  2. 左括号必须以正确的顺序闭合。

单调栈

单调栈:栈内元素保持单调递增或单调递减的栈

(以单调递增栈为例)

入栈规则:

  • 新元素比栈顶元素小:直接入栈

  • 新元素比栈顶元素大:弹出栈内元素直到栈顶比新元素小(或空栈)

出栈意义:

  • 需要出栈时,入栈的新元素是出栈元素右方第一个比出栈元素小的元素

  • 出栈后,新的栈顶是出栈元素左侧最大的数

技巧:最后添加一个值为0的哨兵节点,可以在最后强制所有元素出栈。

以下分别使用了单调递增栈和单调递减栈

柱状图中最大的矩形

84. 柱状图中最大的矩形

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

接雨水

42. 接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

设计类问题

2. 用栈实现队列

最后更新于