定义
栈内元素单调按照递增(递减)顺序排列的栈。
主要用于找到每一个元素左边或右边,第一个比它大或小的数时,可使用单调栈算法。
时间复杂度
由于每个元素最多各自进出栈一次,复杂度是O(n)
功能
递增单调栈:
在一个队列中针对每一个元素从它右边找到第一个比它小的元素
在一个队列中针对每一个元素从它左边找到第一个比它小的元素
递减单调栈:
在一个队列中针对每一个元素从它右边寻找第一个比它大的元素
在一个队列中针对每一个元素从它左边寻找第一个比它大的元素
算法步骤
示例1 递增单调栈
下一个元素要入栈时,先弹出所有比它大的元素
取一组元素为 5,3 ,4 ,7,2,9;
step1:5入栈;
step2:想让3入栈,发现栈顶元素5大于3
弹出5,发现栈为空,3入栈。
step3:想让4入栈,发现栈顶元素3比4小,直接入栈
step4:7同理直接入栈
step5: 想让2入栈,2是最小的,弹出所有元素后入栈
step6:想让9入栈,9大于2,直接入栈
所以栈中最终的元素是2,9。
由于大于入栈元素的会先被弹出,所以栈中留下的,一定是入栈元素左边比它小的元素
弹出大于元素后,栈顶元素就是入栈元素的左边第一个比它小的元素
相对的,入栈元素是栈顶元素的右边第一个比它大的元素
递增单调栈实例代码
#include<iostream>
#include<stack>
using namespace std;
int main()
{
int n;
cin>>n;
stack<int>st; //栈容器
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
while(!st.empty()&&st.top()>x)st.pop(); //弹出所有大于x的元素
cout<<(st.empty()?-1:st.top())<<endl; //输出栈顶元素
st.push(x); //x入栈
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具