1、概念
单调栈分为递增和递减两种类型。
单调递增栈原理:将栈中的头部元素和新插入的元素进行大小比较;如果栈顶元素大于新插入元素,那么栈顶元素被移除,继续将新的栈顶元素和新插入元素比较,直至新插入元素大于栈顶元素。比较完成之后,插入新的元素至栈顶。
左右:单调性,确保每个元素的左边元素是离自己小的第一个元素。
2、实战代码
通过单调递增栈,输出一个序列中每个元素左边第一个比它小的元素。
const int N = 1e5 + 10; // 数组最大长度
int q[N]; // 模拟栈的数组(存储元素值)
int t = 0; // 栈顶指针(初始为空栈)
int main()
{
int n; cin >> n; // 输入元素个数
for (int i = 0; i < n; i++)
{
int x; cin >> x; // 输入当前元素 x
while (t && q[t] >= x) t--; // 维护单调性:弹出栈顶所有 >= x 的元素
// 输出结果:栈顶即为左边第一个比 x 小的数(若栈空则无解)
if (t) cout << q[t] << ' ';
else cout << -1 << ' ';
q[++t] = x;// 将当前元素压入栈
} return 0;
}