单调栈

定义
单调栈是一种基于栈结构的简单数据结构
所谓的单调栈就是维护一个单调递增或单调递减的栈,
单调栈维护的实质上是一段区间,如求一段区间内的最值、找一个数左或右边第一个比他大或小的元素的位置等,我们用了一个数来对整个区间取有效值,整个栈是动态、是变化的,每个当前弹出的值,都是当前状态的最优解。
例如实现一个单调递减的栈:

一组数 2 1 4 5 1 3 3,从左到右依次扫描入栈

2入栈:此时栈为空,直接入栈,栈顶为2;
1入栈:比栈顶元素小,栈顶弹出,栈内元素为1;
4入栈:比栈顶元素大,为有效值,直接入栈,栈内元素为1,4;
5入栈:比栈顶元素大,同上,栈内元素为1,4,5;
1入栈:比栈顶元素小,栈顶弹出,直到栈内为空或者栈顶元素比它小
时,停止操作,栈内元素为1;
3入栈:比栈顶元素大,直接入栈,栈内元素为1,3;
3入栈:和栈顶元素相等,栈顶弹出;
栈顶弹出时根据题意计算最优值
代码如下:

long long int ans=0;
         for(int i=1;i<=n+1;i++)
         {
             if(a[i]>s[p])
             {
                 s[++p]=a[i];
                 w[p]=1;
             }
             else
             {
                 int width=0;
                 while(s[p]>a[i])
                 {
                     width+=w[p];
                     ans=max(ans,width*s[p]);
                     p--;
                 }
                 s[++p]=a[i];
                 w[p]=width+1;
             }
         }
         printf("%lld\n",ans);

你可能感兴趣的:(单调栈)