1154_Give you a Bag

Give you a Bag

  • Description

    有这样一种类似于闭包的数据结构,支持两种操作:
    1 x
    把元素 x 放入 这个包内

    2
    从包内丢弃一个元素

    现在我们给你一个操作带返回值的操作序列,我们需要你猜这个数据结构是什么。
    你有以下选择:
    Stack 栈(先进后出)
    Queue 队列(先进先出)
    Priority-queue 优先权队列( 每次都丢弃最大元素的最大堆 )

  • Input

    有多组测试用例。每个测试案例开始行包含一个整数N(1 <= N <=1000)。以下N行,每行一个操作。 对于操作一,输入为1 x,x代表将要放入数据结构里面的数,对于操作二,输入2 x,这里的x代表返回值,即执行操作2之后,返回的一个值(例如优先权队列,则返回的是最大值)。x的值始终是一个正整数不大于100。输入到文件尾。输入文件的大小不超过1MB。

  • Output

    对于每个测试用例,输出下面语句中的其中一个:
    stack:表示判断这一定是一个堆栈。
    queue:表示判断这一定是一个队列。
    priority queue: 表示判断这一定是一个优先级队列。
    impossible: 表示判断它不可能是一个堆栈,队列或优先级队列。
    not sure: 表示判断它可能是以上所说三种数据结构中的多种。

  • Sample Input

6
1 1
1 2
1 3
2 1
2 2
2 3
6
1 1
1 2
1 3
2 3
2 2
2 1
2
1 1
2 2
4
1 2
1 1
2 1
2 2
7
1 2
1 5
1 1
1 3
2 5
1 4
2 4

  • Sample Output

queue
not sure
impossible
stack
priority queue

#include <iostream>
#include <cstdio>
#include <stack>
#include <queue>
#include <set>
#include <vector>
#include <algorithm>

using namespace std;

struct comp
{
    bool operator()(const int &a,const int &b)
    {
        return a<b;
    }
};

void solve()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        stack<int> stk;
        queue<int> que;
        priority_queue<int,vector<int>,comp> pque;
        bool f1=true,f2=true,f3=true;

        for(int i=0;i<n;i++)
        {
            int a,b;
            scanf("%d %d",&a,&b);
            if(a==1)
            {
                if(f1)  stk.push(b);
                if(f2)  que.push(b);
                if(f3)  pque.push(b);
            }
            else
            {
                if(f1)
                {
                    if(stk.empty())f1=false;
                    else
                    if(stk.top()!=b)
                    f1=false;
                    else    stk.pop();
                }
                if(f2)
                {
                    if(que.empty())f2=false;
                    else
                    if(que.front()!=b)
                    f2=false;
                    else    que.pop();
                }
                if(f3)
                {
                    if(pque.empty())f3=false;
                    else
                    if(pque.top()!=b)
                    f3=false;
                    else    pque.pop();
                }
            }
        }
        if(!(f1 || f2 || f3))cout<<"impossible"<<endl;
        else    if(f1 && !f2 && !f3) cout<<"stack"<<endl;
        else    if(!f1 && f2 && !f3) cout<<"queue"<<endl;
        else    if(!f1 && !f2 && f3) cout<<"priority queue"<<endl;
        else    cout<<"not sure"<<endl;
    }
}

int main()
{
    solve();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值