数据结构打卡:单调栈
题目:链接:830. 单调栈 - AcWing题库
给定一个长度为 NN 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1−1。
输入格式
第一行包含整数 NN,表示数列长度。
第二行包含 NN 个整数,表示整数数列。
输出格式
共一行,包含 NN 个整数,其中第 ii 个数表示第 ii 个数的左边第一个比它小的数,如果不存在则输出 −1−1。
数据范围
1≤N≤1051≤N≤105
1≤数列中元素≤1091≤数列中元素≤109
输入样例:
5
3 4 2 7 5
输出样例:
-1 3 -1 2 2
————————————手写模拟大概就是下图了:
单调栈,就是真的是单调栈,栈内元素由栈底到栈顶严格递增。
写程序的时候,如果栈为空,就直接输出-1,并将该元素压入栈。如果栈不为空,如果栈顶元素大于等于该元素并且栈不为空,就不断弹出栈内元素,如果此时栈为空,就输出-1并将该元素压入栈,如果栈不为空,输出此时的栈顶元素,最后再将该元素压入栈。
还有一个比较好的动画演示,清晰易懂给,链接:AcWing 830. 单调栈--图解,详细注释 - AcWing。
代码部分:
#include<cstdio> #include<iostream> #include<stack> using namespace std; const int ins = 1e5+10; int a[ins];int main(){
int n,x;
scanf("%d",&n);
stack<int> sta;
for(int i=1;i<=n;i++){
scanf("%d",&x);
if(!sta.empty()){
if(sta.top()<x){
printf("%d ",sta.top());
sta.push(x);
}
else{
while(!sta.empty()&&sta.top()>=x)
sta.pop();
if(sta.empty())
{printf("-1 ");sta.push(x);}
else{
printf("%d ",sta.top());sta.push(x);
}
}
}
else{
printf("-1 ");
sta.push(x);
}
}
return 0;
}