定义
先说单调栈的定义
单调栈,是指栈内数据逐步上升(一个比一个大),或逐步下降(一个比一个小)的栈,其并没有独立的代码,而是在stack的基础上加以限制及条件形成的。
比如:一个数据想要入栈,基础的stack直接就push了,而单调栈不同,它需要进行“审核”,看是否符合入栈的要求,以单调递增栈为例,看以下这组数据:
5
10 20 15 30 50
共5个数字,先来后到,10先进行审核
10判断栈内为空,直接入栈;
20判断栈不为空,继续判断20比栈顶元素10大,可以入栈;
15判断栈不为空,继续判断15不比栈顶元素大,不能直接入栈;
所以弹出栈顶元素20,判断此时的栈顶元素10比15小,可以入栈;
30判断栈不为空,继续判断30比栈顶元素15大,可以入栈;
50判断栈不为空,继续判断50比栈顶元素30大,可以入栈;
这组数据就入栈成功了,而20因为中间的过程被弹出来了,可以根据具体题目进行修改,比如在15入栈后再重新入栈等。递减栈也是类似,修改一下判断条件就行。
正文
每日温度
样例复制:
样例1
8
73 74 75 71 69 72 76 73
样例2
4
30 40 50 60
样例3
3
30 60 90
#include<bits/stdc++.h>
#include<stack>
using namespace std;
struct sss
{int x,y;
};
int a[110]={0};
int b[110]={0};
int n;
int main()
{stack<sss> s;cin>>n;for(int i=0;i<n;i++){cin>>a[i];sss t;t.x=a[i];t.y=i;if(s.empty()==true){s.push(t);}else if(s.top().x>t.x){s.push(t);}else{while(true){if(s.empty()==true||s.top().x>t.x)break;b[s.top().y]=i-s.top().y;s.pop();}s.push(t);}}for(int i=0;i<n;i++){cout<<b[i]<<" ";}return 0;
}