原题链接
模拟栈
#include<iostream>
using namespace std;
const int N=1e6+10;
int st[N];
int main()
{
int n,t=0;
scanf("%d",&n);
while(n--)
{
string s;
cin>>s;
if(s=="push")
{
int x;
cin>>x;
st[++t]=x;
}
else if(s=="pop")
{
t--;
}
else if(s=="empty")
{
if(t==0)
printf("YES\n");
else
printf("NO\n");
}
else if(s=="query")
{
cout<<st[t]<<endl;
}
}
return 0;
}
原题链接
原理:two points
for(int i=0;i<n;i++)
{
for(int j=i-1;j>=0;j--)
{
//遇到第一个小于i处的数就返回
}
}
采用单调栈降低时间复杂度
每次都在找离着自己最近的最小的数,那么我们不得不思考,是不是要用到后进先出的栈
当ax>=ay且x<y时,ax必然不符合,不需考虑加入栈中,所以栈中元素最终生成一个单调递增的序列
int n;
int stk[MAX];
int tt=0;
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int x;
scanf("%d",&x);
while(tt&&stk[tt]>=x)//栈顶非空,栈顶元素大于要插入的数
tt--;
if(tt)
cout<<stk[tt]<<" ";
else
cout<<"-1"<<" ";
stk[++tt]=x;//将此元素压入
}
return 0;
}
网友评论