题意翻译
猜猜数据结构
试题描述:
你有一个类似“包包”的数据结构,支持两种操作,如下表所示。 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;
}