【单调栈】单调栈理论基础
所谓单调栈,就是从栈底到栈顶元素按照一定的顺序进行排序
单调栈分为**单调递增栈**和**单调递减栈**:
## 单调递增栈
**单调递增栈**:即栈内元素从栈底到栈顶保持单调递增的栈
单调递增栈操作规则:
- 如果新的元素比栈顶元素大,就入栈
- 如果新的元素较小,那就一直把栈内元素弹出来,直到栈顶比新元素小
基本模板:
```java
class Solution {
public int[] nextGreaterElements(int[] nums) {
if (nums == null || nums.length == 0) {
return new int[0];
}
int len = nums.length;
int[] res = new int[len];
// 单调递减栈(栈底 -> 栈顶)
// 栈中存储下标
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < len; i ++) {
// 1. 栈为空,直接入栈
if (stack.isEmpty()) {
stack.push(i);
}
// 2. 如果新的元素比栈顶元素大,直接入栈
else if (nums[i] < nums[stack.peek()]) {
stack.push(i);
}
// 3. 如果新的元素较小,那就一直把栈内元素弹出来,直到栈顶比新元素小
else {
while (!stack.isEmpty() && nums[i] > nums[stack.peek()]) {
res[stack.peek()] = nums[i];
stack.pop();
}
stack.push(i);
}
}
return res;
}
}
```
写得简单点(如果直接就看这种版本可能不太好理解,熟练之后推荐直接用这个版本的代码):
```java
class Solution {
public int[] nextGreaterElements(int[] nums) {
if (nums == null || nums.length == 0) {
return new int[0];
}
int len = nums.length;
int[] res = new int[len];
// 单调递减栈(栈底 -> 栈顶)
// 栈中存储下标
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < len; i ++) {
while (!stack.isEmpty() && nums[i] > nums[stack.peek()]) {
res[stack.peek()] = nums[i];
stack.pop();
}
stack.push(i);
}
return res;
}
}
```
## 单调递减栈
**单调递减栈**:即栈内元素从栈底到栈顶保持单调递减的栈(本题使用的就是都单调递减栈)
单调递减栈操作规则:
- 如果新的元素比栈顶元素小,就入栈
- 如果新的元素较大,那就一直把栈内元素弹出来,直到栈顶比新元素大
