题意:你有一个类似“包包”的数据结构,支持两种操作,如表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 */