码迷,mamicode.com
首页 > 其他好文 > 详细

单调栈

时间:2019-09-27 23:05:25      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:简单   长大   pac   mem   入栈   通过   特点   fifo   根据   

组长大大辛辛苦苦整理的周任务,当然要好好完成啦。比较喜欢单调栈详解的博客,嘿嘿嘿。

相关博客收藏:单调栈原理及应用 详解 附各种类型的题目练习

std::stack 基本操作

个人理解:

单调栈简单来说就是根据栈的特点,保持栈内单调递增或递减。(栈:后进先出(LIFO-last in first out):最后插入的元素最先出来。  队列:先进先出(FIFO-first in first out):最先插入的元素最先出来。)

例如:实现一个单调递增的栈,比如现在有一组数10,3,7,4,12。从左到右依次入栈,则如果栈为空或入栈元素值小于栈顶元素值,则入栈;否则,如果入栈则会破坏栈的单调性,则需要把比入栈元素小的元素全部出栈。单调递减的栈反之。

模板题:

简单理解之后,写了一个模板题,下面是通过的代码(大佬帮忙改bug的时候,表示这个板子太复杂了,心塞塞,继续加油啦!!!)

POJ 2559

多组样例,每组 n n个数据 最后一个输入0。结束
1<=n<= 100000
Sample Input

7 2 1 4 5 1 3 3
4 1000 1000 1000 1000
0
Sample Output

8
4000

数据规模与约定

时间限制:1s1s

空间限制:64MB
*/

技术图片
#include <iostream>
#include <stack>
#include <string.h>
#include <stdio.h>
using namespace std;
int  n,height[100080]={},width[100080]={},top=0;
long long ans=0;
int main()
{
    stack<int> mystack;
    while(cin>>n&&n!=0)
    {
        for(int i=1;i<=n;i++) scanf("%d",&height[i]);
        height[n+1]=0;
        while(!mystack.empty())
        {
            mystack.pop(); 
        } //先清空栈
        for(int i=1;i<=n+1;i++)
        {
            if(mystack.empty()||mystack.top()<=height[i]) 
            {
                mystack.push(height[i]);
                width[++top]=1;
            }
            else 
            {
                int Widthsum=0;
                while(!mystack.empty()&&mystack.top()>height[i]/*栈非空并且栈顶元素大于等于入栈元素*/)
                {
                    Widthsum+=width[top];
                    ans=max(ans,(long long)Widthsum*mystack.top());
                    mystack.pop();
                    top--;
                    //栈顶元素出栈;
                    //更新结果; 
                } 
                mystack.push(height[i]);
                width[++top]=Widthsum+1;
            }      
        }
        printf("%lld\n",ans);
        memset(height,0,sizeof(height));
        memset(width,0,sizeof(width));
        top=0;
        ans=0;
    }
    return 0;
} 
View Code

 

单调栈

标签:简单   长大   pac   mem   入栈   通过   特点   fifo   根据   

原文地址:https://www.cnblogs.com/young-children/p/11600703.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!