题目
解释
- 对输入的整数进行弹出栈后最终得到的相当于是一个单调递增的栈
- 由tt作为指针,来控制元素的弹出
- 对于入栈的第一个元素,此时tt为0,所以直接输出-1
- 对于后续入栈的元素,将指针tt前移如果stk[tt]>=x,则将当前元素弹出栈,直到遇到第一个小于x的元素
- 可以不断将比x大的元素弹出栈而对于后续元素的寻找不影响的原因在注释中给出!
代码段
#include<iostream>
using namespace std;
const int N=1e5+10;
int n,tt;
int stk[N];
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
int x;
cin>>x;
while(tt&&stk[tt]>=x)tt--;
//tt--的操作相当于将左边大于等于x的元素都弹出了栈
//最终留下了第一个比x小的元素
//合理性在于tt指向的元素比x大,则对于后面入栈得元素
//该元素必然不作考虑输出
if(tt)cout<<stk[tt]<<' ';
//如果栈中没有元素了,则代表找不到更小的元素了
else cout<<-1<<' ';
stk[++tt]=x;
}
return 0;
}