zoukankan      html  css  js  c++  java
  • 数据结构:单调栈

    单调栈和单调队列都是比较废物的

    单调栈的栈具有单调性,可以找到从左或者从右遍历第一个比当前元素小或者比当前元素大的元素的位置

    首先给出维护单调栈的代码

            while(s.size()&&a[s.top()]>=a[i])
                s.pop();

    可以看出这是一个单调递增栈,栈顶元素一定是最小的

    我们这里用一个数组来记录每一个元素在向左遍历的时候,第一个比当前元素大的元素额位置

    如果这个时候的栈是空的,说明左边没有比当前元素更大的元素了,否则,第一个比当前元素大的元素一定是栈顶元素

    这里采用和单调队列中类似的处理办法,还是存的是下标

    if(s.empty())
                l[i]=0;
            else
                l[i]=s.top();
            s.push(i);

    然后我们给出完整的代码,相比较于单调队列,更加简单,但是用的时候却很神奇

     1 #include<iostream>
     2 #include<stack>
     3 using namespace std;
     4 const int maxn=100005;
     5 int n;
     6 int a[maxn];
     7 int l[maxn];
     8 stack<int> s;
     9 
    10 int main()
    11 {
    12     cin>>n;
    13     for(int i=1;i<=n;i++)
    14         cin>>a[i];
    15     for(int i=1;i<=n;i++)
    16     {
    17         while(s.size()&&a[s.top()]>=a[i])
    18             s.pop();
    19         if(s.empty())
    20             l[i]=0;
    21         else
    22             l[i]=s.top();
    23         s.push(i);
    24     }
    25     for(int i=1;i<=n;i++)
    26         cout<<l[i]<<" ";
    27     return 0;
    28 }
  • 相关阅读:
    ByteArrayInputStream(字节数组输入流) 示例
    ASP.NET 页面对象模型
    HTML常用标记
    [elementui]上线iconfont乱码
    time与timeEnd测试运行时间
    放大镜效果
    canvas
    [css] 样式列表
    千分符
    centos源失败
  • 原文地址:https://www.cnblogs.com/aininot260/p/9304673.html
Copyright © 2011-2022 走看看