前言
单调栈这部分能出的题很少,只需要把几个典型的例题记住即可!!!
一、单调栈的基本内容
单调栈既然被称为单调,说明在栈内的元素是单调的,分为单调递增栈,单调递减栈。
- 单调递增栈:从栈底到栈顶数据是从大到小
- 单调递减栈:从栈底到栈顶数据是从小到大
模板(STL):
for (遍历这个数组)
{
if (栈空 || 栈顶元素大于等于当前比较元素)
{
入栈;
}
else
{
while (栈不为空 && 栈顶元素小于当前元素)
{
栈顶元素出栈;
更新结果;
}
当前数据入栈;
}
}
二、典型例题
1.例题
2.AC代码
数组模拟:
#include<iostream>
#include<stack>
using namespace std;
const int N=1e5+7;
int a[N];
int n,m,x;
int main()
{
cin>>n;
for(int i=0;i<n;i++){
cin>>x;
while(m && a[m]>=x) m--;
if(m)cout<<a[m]<<" ";
else cout<<"-1"<<" ";
a[++m]=x;
}
return 0;
}
STL:
#include<bits/stdc++.h>
//STL
//由题目可知是找每个数左边比它小的数,因此应该从左边向右开始遍历
using namespace std;
const int N =1e5+10;
stack<int>s;
int a[N],n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
while(!s.empty() && a[s.top()]>=a[i])
s.pop();
if(!s.empty()) cout<<a[s.top()]<<" ";
else cout<<-1<<" ";
s.push(i);
}
return 0;
}