qu(判定操作序列)NOIP模拟 数据结构判断 模拟

【问题描述】 给你一个操作序列,问这个维护操作序列的数据结构是哪一种?

【输入格式】 第一行是一个正整数𝑛代表操作数目。 接下来𝑛行,每行两个正整数𝑜𝑝𝑡, 𝑣。如果𝑜𝑝𝑡 = 1,代表我们将𝑣加入数据结构;如果𝑜𝑝𝑡 = 2,代表我们从数据结构中取出了一个元素,这个元素的值是𝑣。

【输出格式】 输出三行,第一行代表数据结构是否可能是栈,第二行代表数据结构是否可 能是队列,第三行代表数据结构是否可能大根堆。每一行的结果都只可能是“YES” 或者“No”。

根据题意,建立三种数据结构:队列、优先队列(本质是大根堆)和栈,然后模拟即可。

坑点有两个。

一个是,当数据全部弹出后,还有弹出操作,那一定不满足任意数据结构,三个都是No

第二个,题目的YES是全部大写的,但是No的o是小写的。

附上代码

#include<cstdio>
#include<queue>
using namespace std;
template<class T> inline void read(T &_a){
    bool f=0;int _ch=getchar();_a=0;
    while(_ch<'0' || _ch>'9'){if(_ch=='-')f=1;_ch=getchar();}
    while(_ch>='0' && _ch<='9'){_a=(_a<<1)+(_a<<3)+_ch-'0';_ch=getchar();}
    if(f)_a=-_a;
}

int n,opt,v,stack[10001],head;
bool ansq=true,anspq=true,ansstk=true;
queue<int>q;
priority_queue<int>pq;

int main()
{
    freopen("qu.in","r",stdin);
    freopen("qu.out","w",stdout);
    read(n);
    for (register int i=1;i<=n;++i)
    {
        read(opt); read(v);
        if(opt==1)
        {
            if(ansq) q.push(v);
            if(ansstk) stack[++head]=v;
            if(anspq) pq.push(v);
        } else {
            if(ansstk)
            {
                if(head&&stack[head]==v) --head;
                 else ansstk=false;
            }
            if(ansq)
            {
                if(!q.empty()&&q.front()==v) q.pop();
                 else ansq=false;
            }
            if(anspq)
            {
                if(!pq.empty()&&pq.top()==v) pq.pop();
                 else anspq=false;
            }
        }
    }
    printf("%s\n%s\n%s",ansstk?"YES":"No",ansq?"YES":"No",anspq?"YES":"No");
    return 0;
}

 

posted @ 2017-10-30 18:59  JayWang  阅读(305)  评论(0编辑  收藏  举报