数据结构打卡:单调栈

题目:链接:830. 单调栈 - AcWing题库

给定一个长度为 NN 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 1−1。

输入格式

第一行包含整数 NN,表示数列长度。

第二行包含 NN 个整数,表示整数数列。

输出格式

共一行,包含 NN 个整数,其中第 ii 个数表示第 ii 个数的左边第一个比它小的数,如果不存在则输出 1−1。

数据范围

1N1051≤N≤105
11091≤数列中元素≤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;
}

复制代码

 

本文作者:风归去

本文链接:https://www.cnblogs.com/N-lim/p/15085108.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   风归去  阅读(28)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
🔑