什么是单调栈?先打破'栈'的常规认知
提到栈,大家首先想到的是'先进后出'的线性结构,而单调栈,顾名思义,就是在普通栈的基础上,给元素加上了'单调性'的约束——栈内的元素必须严格保持递增或递减(也可根据需求调整为非严格递增/递减)。
1.1 单调栈的核心特性
本质还是栈:完全遵循栈的'先进后出'规则,只是多了'维护单调性'的操作; 单调性可控:可维护单调递增栈(栈底到栈顶元素从小到大),也可维护单调递减栈(栈底到栈顶元素从大到小); 操作高效:每个元素最多入栈一次、出栈一次,整体时间复杂度稳定在 O(n)。
1.2 如何实现一个单调栈?
话不多说,先看基础代码实现。我们以 C++ 为例,分别实现单调递增栈和单调递减栈:
实现单调递增栈
#include <iostream>
#include <stack>
using namespace std;
const int N = 3e6 + 10; // 适配大数据量场景
int a[N], n; // 维护单调递增栈:栈内元素从小到大
void monotonicIncreasingStack() {
stack<int> st;
for (int i = 1; i <= n; i++) {
// 关键操作:弹出所有大于等于当前元素的栈顶元素,保证单调性
while (st.size() && st.top() >= a[i]) {
st.pop();
}
st.push(a[i]); // 插入当前元素,栈仍保持递增
}
}
实现单调递减栈
// 维护单调递减栈:栈内元素从大到小
void monotonicDecreasingStack() {
stack<int> st;
for (int i = ; i <= n; i++) {
(st.() && st.() <= a[i]) {
st.();
}
st.(a[i]);
}
}


