一、单调栈的定义与作用
单调栈的最典型应用是在一个数组中,找到离该数最近的,较大或较小的数。单调栈实际上底层逻辑是一个双指针算法,是对暴力双循环的简化。
以板子题为例:
如有数组 3 4 2 6 7 1
输出在各数左边比他小的数,如果没有,输出-1。
暴力做法显而易见是运用双重循环,运用双指针算法,j指针一直往后移,指向当前要处理的数,i指针要指向符合题目条件的数(单纯用指针模拟较难得到结果,所以用栈这种数据结构的栈顶来代替i指针)
用一句话概括:如果一个数又靠右又小,那么他左边比他小的数就永远不可能成为答案,直接删掉就好了,按此方法,栈中维护着一个单调递增的序列,故名,单调栈。
二、例题与代码
#include<iostream>
using namespace std;
const int N=100010;
int stk[N];
int arr[N];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int x;
cin>>x;
arr[i]=x;
}
int tt=0;//记录栈中元素数量。
for(int i=0;i<n;i++)
{
while(tt&&(stk[tt]>=arr[i]))tt--;
if(tt)cout<<stk[tt]<<" ";
else cout<<-1<<" ";
stk[++tt]=arr[i];
}
return 0;
}