0. 前言
单调栈主要用于求取左边第一个比它大,或者比它小的数。
就比如站队随便排成一列,可以求到每个人后面第一个比他高的人。
同理可以推广至右边,比它矮均可。这就是单调递增栈、递减栈,从前至后入栈,从后向前入栈的区别了。
单调栈比较抽象,非常具有智慧的想法,可应用的场景相当少,根据几个经典题目体会它的用法会极大的帮助理解。手动模拟一遍数据就能够完全理解了。
1. 单调栈
这里是拿数组模拟栈。
模板代码:
#include <iostream>
using namespace std;
const int N = 1e5+5;
int n;
int stk[N], tt;
int main() {
cin >> n;
for (int i = 0; i < n; ++i) {
int x;
cin >> x;
while (tt && stk[tt] >= x) tt--;
if (tt) cout << stk[tt] << ' ';
else cout << -1 << ' ';
stk[++tt] = x;
}
return 0;
}