栈专题练习

Posted autoint

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈专题练习相关的知识,希望对你有一定的参考价值。

HDU4699 Editor

技术图片
使用“对顶栈”,维护一下前缀和和最大前缀和就行了。

时间复杂度(O(Q))

#include<bits/stdc++.h>
#define rg register
#define il inline
#define co const
template<class T>il T read(){
    rg T data=0,w=1;
    rg char ch=getchar();
    while(!isdigit(ch)){
        if(ch=='-') w=-1;
        ch=getchar();
    }
    while(isdigit(ch))
        data=data*10+ch-'0',ch=getchar();
    return data*w;
}
template<class T>il T read(rg T&x){
    return x=read<T>();
}
typedef long long ll;
using namespace std;

co int N=1e6+1;
int s[N],t[N];
int sum[N],f[N]={-1000};
int main(){
//  freopen(".in","r",stdin);
//  freopen(".out","w",stdout);
    int q;
    while(~scanf("%d",&q)){
        s[0]=t[0]=0;
        while(q--){
            char opt[2];
            scanf("%s",opt);
            switch(opt[0]){
                case 'I':{
                    s[++s[0]]=read<int>(),sum[s[0]]=s[s[0]]+sum[s[0]-1],f[s[0]]=max(sum[s[0]],f[s[0]-1]);
                    break;
                }
                case 'D':{
                    --s[0];
                    break;
                }
                case 'L':{
                    if(s[0]) t[++t[0]]=s[s[0]--];
                    break;
                }
                case 'R':{
                    if(t[0]) s[++s[0]]=t[t[0]--],sum[s[0]]=s[s[0]]+sum[s[0]-1],f[s[0]]=max(sum[s[0]],f[s[0]-1]);
                    break;
                }
                case 'Q':{
                    printf("%d
",f[read<int>()]);
                    break;
                }
                default: assert(0);
            }
        }
    }
    return 0;
}

CH1101 火车进栈

dfs模拟即可。要求字典序最小,优先出栈。

#include<bits/stdc++.h>
#define rg register
#define il inline
#define co const
template<class T>il T read(){
    rg T data=0,w=1;
    rg char ch=getchar();
    while(!isdigit(ch)){
        if(ch=='-') w=-1;
        ch=getchar();
    }
    while(isdigit(ch))
        data=data*10+ch-'0',ch=getchar();
    return data*w;
}
template<class T>il T read(rg T&x){
    return x=read<T>();
}
typedef long long ll;
using namespace std;

co int MAX=20;
int n,cnt;
vector<int> v,way;
void dfs(int now){
    if(now>n){
        for(int i=v.size()-1;i>=0;--i)
            way.push_back(v[i]);
        for(int i=0;i<way.size();++i)
            printf("%d",way[i]);
        puts(""),++cnt;
        for(int i=1;i<=v.size();++i)
            way.pop_back();
        return;
    }
    if(v.size()){
        int t=v.back();
        v.pop_back(),way.push_back(t);
        dfs(now);
        if(cnt==MAX) return;
        v.push_back(t),way.pop_back();
    }
    v.push_back(now);
    dfs(now+1);
    if(cnt==MAX) return;
    v.pop_back();
}
int main(){
//  freopen(".in","r",stdin);
//  freopen(".out","w",stdout);
    read(n);
    dfs(1);
    return 0;
}

以上是关于栈专题练习的主要内容,如果未能解决你的问题,请参考以下文章

数据结构练习专题

JVM专题-本地方法栈

poj 动态规划专题练习

JVM技术专题 带你梳理分析虚拟机栈映射源代码的流程「原理篇」

栈与队列专题

《寒假算法集训》(专题六)栈