懒人速刷之java栈和队列
栈和队列
简介
栈的特点是后入先出
根据这个特点可以临时保存一些数据,之后用到依次再弹出来,常用于树的非递归遍历、 DFS 深度搜索。
队列常用于BFS广度搜索,很少单独考察。
基本应用
逆波兰表达式求值
波兰表达式计算 > 输入:
["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();
}有效的括号
给定一个只包括
'(',')','{','}','[',']'的字符串s,判断字符串是否有效。有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
单调栈
单调栈:栈内元素保持单调递增或单调递减的栈
(以单调递增栈为例)
入栈规则:
新元素比栈顶元素小:直接入栈
新元素比栈顶元素大:弹出栈内元素直到栈顶比新元素小(或空栈)
出栈意义:
需要出栈时,入栈的新元素是出栈元素右方第一个比出栈元素小的元素
出栈后,新的栈顶是出栈元素左侧最大的数
技巧:最后添加一个值为0的哨兵节点,可以在最后强制所有元素出栈。
以下分别使用了单调递增栈和单调递减栈
柱状图中最大的矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
接雨水
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
设计类问题
最后更新于