单调栈的应用

单调栈的使用
单调栈的分类
  1. 单调递增栈
  2. 单调递减栈

所谓的递增和递减,相对的是:
栈顶 — 栈底的数据大小表示

栈顶 -> 栈底 从小到大 ,单调递增
栈顶 -> 栈底 从大到小, 单调递减

单调栈的实现方式(举例用单调递增栈)

从后向前进行保存,并读取。

  1. 如果栈空入栈
  2. 栈非空,此时栈顶元素 >= 入栈元素,入栈
  3. 栈非空,此时栈顶元素 < 入栈元素,则元素出栈,直到栈顶元素 >= 入栈元素,或者栈为空为止, 然后入栈

实现代码如下:

    stack<int> st;
    int x;
    cin >> x;
    while (!st.empty() && st.top() < x)
    {
        st.pop();
    }
    st.push(x);
使用(用来求解单调性)

栈顶读出来一个元素,该元素满足单调性的某一端。

例题:
  • P5788 【模板】单调栈
#include<cstdio>
#include<stack>
#include<iostream>
using namespace std;
int n,a[3000005],f[3000005];//a是需要判断的数组(即输入的数组),f是存储答案的数组
stack<int>st;//模拟用的栈
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
	int n;
    cin >> n;
    for(int i = 1; i<= n;i++)
        cin >> a[i];
    //从后向前, 只招贴近,是单调递增栈
    for(int i = n ;i >= 1;i--)
    {
        while(!st.empty() && a[st.top()] <= a[i])
        {
            st.pop();
        }
        if(st.empty())
            f[i] = 0;
        else  
            f[i] = st.top();
        st.push(i);
    }
    for(int i = 1;i <= n;i++)
    {
        cout << f[i] << " ";
    }
    cout << endl;
	return 0;
}

博客借鉴
链接: https://blog.csdn.net/lucky52529/article/details/89155694

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值