单调栈的使用
单调栈的分类
- 单调递增栈
- 单调递减栈
所谓的递增和递减,相对的是:
栈顶 — 栈底的数据大小表示
栈顶 -> 栈底 从小到大 ,单调递增
栈顶 -> 栈底 从大到小, 单调递减
单调栈的实现方式(举例用单调递增栈)
从后向前进行保存,并读取。
- 如果栈空入栈
- 栈非空,此时栈顶元素 >= 入栈元素,入栈
- 栈非空,此时栈顶元素 < 入栈元素,则元素出栈,直到栈顶元素 >= 入栈元素,或者栈为空为止, 然后入栈
实现代码如下:
stack<int> st;
int x;
cin >> x;
while (!st.empty() && st.top() < x)
{
st.pop();
}
st.push(x);
使用(用来求解单调性)
栈顶读出来一个元素,该元素满足单调性的某一端。
例题:
- P5788 【模板】单调栈
#include<cstdio>
#include<stack>
#include<iostream>
using namespace std;
int n,a[3000005],f[3000005];//a是需要判断的数组(即输入的数组),f是存储答案的数组
stack<int>st;//模拟用的栈
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
for(int i = 1; i<= n;i++)
cin >> a[i];
//从后向前, 只招贴近,是单调递增栈
for(int i = n ;i >= 1;i--)
{
while(!st.empty() && a[st.top()] <= a[i])
{
st.pop();
}
if(st.empty())
f[i] = 0;
else
f[i] = st.top();
st.push(i);
}
for(int i = 1;i <= n;i++)
{
cout << f[i] << " ";
}
cout << endl;
return 0;
}
博客借鉴
链接: https://blog.csdn.net/lucky52529/article/details/89155694