题意翻译
猜猜数据结构
试题描述:
你有一个类似“包包”的数据结构,支持两种操作,如下表所示。 1x:把元素x放进包包 2:从包包中拿出一个元素 给出一系列操作以及返回值,你的任务是猜猜这个“包包”到底是什么。它可能是一个栈<后进先出),队列(先进先出),优先队列(数值大的整数先出)或者其他什么奇怪的东西。
输入:
第一行为一个整数n(1≤n≤1 000)。以下n行每行要么是一条类型1的命令,要么是一条类型2的命令后面跟着一个整数x(1≤x≤100)。这个整数x表示执行完这条类型2的命令后,包包无错地返回了x。输入文件大小不超过1MB。
输出:
输出一行。一共有5种可能的输出。
stack:一定是一个栈
queue:一定是一个队列
priority queue:一定是一个优先队列
impossible:一定不是以上三种
not sure:至少有两种是可能的
输入示例:
5 1 5 1 3 1 2 2 2 2 3
输出示例:
stack
题目描述
输入输出格式
输入格式:
输出格式:
输入输出样例
输入样例#1: 复制
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
输出样例#1: 复制
queue not sure impossible stack priority queue
分析:
简单模拟就行
#include<vector>
#include<cstdio>
#include<stack>
#include<queue>
using namespace std;struct Data_Struct
{//vc存放指令pair序列vector<pair<int,int> > vc;//构造函数Data_Struct(int n){for(int i=0;i<n;i++){int x,y;scanf("%d%d",&x,&y);vc.push_back(make_pair(x,y));}}//判断是否可能是一个栈bool is_stack(){stack<int> S;for(int i=0;i<vc.size();i++){int x=vc[i].first, y=vc[i].second;if(x==1) S.push(y);else if(x==2){if(S.empty() || S.top()!=y ) return false;S.pop();}}return true;}//判断是否可能是一个队列bool is_queue(){queue<int> Q;for(int i=0;i<vc.size();i++){int x=vc[i].first, y=vc[i].second;if(x==1) Q.push(y);else if(x==2){if(Q.empty() || Q.front()!=y ) return false;Q.pop();}}return true;}//判断是否可能是一个优先队列bool is_priority_queue(){priority_queue<int> Q;for(int i=0;i<vc.size();i++){int x=vc[i].first,y=vc[i].second;if(x==1) Q.push(y);else{if(Q.empty() || Q.top()!=y )return false;Q.pop();}}return true;}//输出整合后的结果void solve(){int S=is_stack(), Q=is_queue(), PQ=is_priority_queue();if(S+Q+PQ==0) printf("impossible\n");else if(S+Q+PQ==1){if(S) printf("stack\n");else if(Q) printf("queue\n");else if(PQ) printf("priority queue\n");}else if(S+Q+PQ>1)printf("not sure\n");}
};int main()
{int n;while(scanf("%d",&n)==1){Data_Struct ds(n);ds.solve();}return 0;
}