【栈】单调栈

题目

解释

  • 对输入的整数进行弹出栈后最终得到的相当于是一个单调递增的栈
  • 由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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nathan Qian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值