• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
jk-2048
博客园    首页    新随笔    联系   管理    订阅  订阅
单调栈算法

 

定义

栈内元素单调按照递增(递减)顺序排列的栈。
主要用于找到每一个元素左边或右边,第一个比它大或小的数时,可使用单调栈算法。

时间复杂度

由于每个元素最多各自进出栈一次,复杂度是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;
 } 

 

posted on 2024-02-23 17:14  JK降谷羽  阅读(33)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3