UVA ~ 11995 ~ I Can Guess the Data Structure! (模拟)

题意:你有一个类似“包包”的数据结构,支持两种操作,如表3-1所示。

□1 x,把元素x放进包包

□2  从包包中拿出一个元素
给出一系列操作以及返回值,你的任务是猜猜这个“包包”到底是什么。它可能是一个栈(后进先出),队列(先进先出),优先队列(数值大的整数先出) 或者其他什么奇怪的东西。
[输入格式]
输入包含多组数据。每组数据第一行为一个整数n (1<=n<=1000)。以下n行每行要么是一条类型1的命令,要么是一条类型2的命令后面跟着一个整数x (1<=x<=100)表示执行完这条类型2 的命令后,包包无错地返回了x。输入结束标志为文件结束符(EOF)。输入文件大小不超过1MB。
[输出格式)
对于每组数据,输出一行。一共有5种可能的输出,如表3-2所示。

□stack      一定是个栈

□queue     一定是个队列

□priority queue     一定是个优先队列

□impossible     肯定不是栈,队列或者优先队列(甚至有可能不存在这样的包包)

□not sure     栈、队列、优先队列中至少有两种是可能的

[分析]

本题考查了栈、队列和优先队列3种ADT的概念。只要熟悉这些概念,本题不难解决。事实上,STL中已经封装好了这3种数据结构,分别是stack,queue和priority_queue 这样,本题只需要依次判断输入是否有可能是栈、队列或优先队列,然后综合起来即可。注意到题目中说的“无错的返回”,因此在执行POP操作的时候要调用一下empty(),否则可能会异常退出

以上内容来自算法竞赛入门经典-训练指南

思路:刘汝佳大佬讲的很清楚了,直接用STL库,判断一波就好了。


#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e3 + 5;
int n;
int main()
{
    while (~scanf("%d", &n))
    {
        bool flag1 = true, flag2 = true, flag3 = true;
        stack<int> S;
        queue<int> Q;
        priority_queue<int> PQ;
        for (int i = 0; i < n; i++)
        {
            int a, b, t;
            scanf("%d%d", &a, &b);
            if (a == 1)
            {
                S.push(b); Q.push(b); PQ.push(b);
            }
            else
            {
                if (S.empty()) flag1 = flag2 = flag3 = false;
                else
                {
                    t = S.top(); S.pop();
                    if (t != b) flag1 = false;
                    t = Q.front(); Q.pop();
                    if (t != b) flag2 = false;
                    t = PQ.top(); PQ.pop();
                    if (t != b) flag3 = false;
                }
            }
        }
        int ans = flag1 + flag2 + flag3;
        if (ans == 0) puts("impossible");
        else if (ans >= 2) puts("not sure");
        else if (ans == 1)
        {
            if (flag1) puts("stack");
            if (flag2) puts("queue");
            if (flag3) puts("priority queue");
        }
    }
    return 0;
}
/*
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
*/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值