猜猜数据结构D301 |
难度级别:C; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B |
试题描述
|
你有一个类似“包包”的数据结构,支持两种操作,如下表所示。 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
|
其他说明
|
数据说明:数据那肯定非常大,建议用printf和scanf哦。
|
就是建三个数据结构,一个队列一个栈一个优先队列,然后分别模拟,哪个不行就把哪个去掉。
刚开始好几次都是运行时错误,注意如果数据结构没有判空也会导致运行时错误,不一定是数组开小了的问题。
1 #include <iostream> 2 #include <cmath> 3 #include <cstring> 4 #include <cstdio> 5 #include <cstdlib> 6 #include <algorithm> 7 #include <queue> 8 #include <stack> 9 using namespace std; 10 bool owo[5]; 11 int main() 12 { 13 queue <long long> q; 14 stack <long long> s; 15 priority_queue <long long> Q; 16 int n; 17 scanf("%d",&n); 18 memset(owo,1,sizeof(owo)); 19 int ans=3; 20 for(int i=1;i<=n;i++) 21 { 22 int a; 23 long long b; 24 scanf("%d%lld",&a,&b); 25 if(a==1) 26 { 27 if(owo[1]) q.push(b); 28 if(owo[2]) s.push(b); 29 if(owo[3]) Q.push(b); 30 } 31 else 32 { 33 if(owo[1]) 34 if(!q.empty()) if(q.front()==b)q.pop();else {owo[1]=0;ans--;} 35 else {owo[1]=0;ans--;} 36 if(owo[2]) 37 if(!s.empty()) if(s.top()==b)s.pop();else {owo[2]=0;ans--;} 38 else {owo[2]=0;ans--;} 39 if(owo[3]) 40 if(!Q.empty()) if(Q.top()==b)Q.pop();else {owo[3]=0;ans--;} 41 else {owo[3]=0;ans--;} 42 } 43 } 44 if(ans==0) printf("impossible"); 45 else if(ans>1) printf("not sure"); 46 else 47 { 48 if(owo[1]) printf("queue"); 49 else if(owo[2]) printf("stack"); 50 else printf("priority queue"); 51 } 52 system("pause"); 53 return 0; 54 }
代码太复杂了。。