I Can Guess the Data Structure!
There is a bag-like data structure, supporting two operations:
1 x
Throw an element x into the bag.
2
Take out an element from the bag.
Given a sequence of operations with return values, you're going to guess the data structure. It is a stack (Last-In, First-Out), a queue (First-In, First-Out), a priority-queue (Always take out larger elements first) or something else that you can hardly imagine!
Input
There are several test cases. Each test case begins with a line containing a single integer n (1<=n<=1000). Each of the next n lines is either a type-1 command, or an integer 2 followed by an integer x. That means after executing a type-2 command, we get an element x without error. The value of x is always a positive integer not larger than 100. The input is terminated by end-of-file (EOF). The size of input file does not exceed 1MB.
Output
For each test case, output one of the following:
stack
It's definitely a stack.
queue
It's definitely a queue.
priority queue
It's definitely a priority queue.
impossible
It can't be a stack, a queue or a priority queue.
not sure
It can be more than one of the three data structures mentioned above.
Sample Input
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
Output for the Sample Input
queue not sure impossible stack priority queue
题意:对三种数据结构进行模拟,当编号为1的时候,进栈,进队,进优先对,当为2的时候,就出,判断是否为三种数据结构的某一种或某几种,但是要注意对当前情况的判空
代码:
#include<iostream> #include<stack> #include<queue> #include<algorithm> using namespace std; int a[1005]; int b[1005]; int main() { int n; while(cin>>n) { int len1 = 0; int len2 = 0; stack<int> s; queue<int> q; bool flag1 = true; bool flag2 = true; bool flag3 = true; priority_queue<int> pq; for(int i = 0;i<n;i++) { int help; cin>>help; if(help==1) { cin>>a[len1]; s.push(a[len1]); q.push(a[len1]); pq.push(a[len1]); //cout<<pq.top()<<endl; len1++; } else { cin>>b[len2]; if(!s.empty()&&s.top()!=b[len2]||s.empty()) flag1 = false; else if(!s.empty()&&s.top()==b[len2]) s.pop(); if(!q.empty()&&q.front()!=b[len2]||q.empty()) flag2 = false; else if(!q.empty()&&q.front()==b[len2]) q.pop(); if(!pq.empty()&&pq.top()!=b[len2]||pq.empty()) flag3 = false; else if(!pq.empty()&&pq.top()==b[len2]) pq.pop(); len2++; } } if(len1<len2) { cout<<"impossible"<<endl; continue; } if(flag1&&flag2||flag1&&flag3||flag2&&flag3) { cout<<"not sure"<<endl; continue; } if(flag1) { cout<<"stack"<<endl; continue; } if(flag2) { cout<<"queue"<<endl; continue; } if(flag3) { cout<<"priority queue"<<endl; continue; } if(!flag1&&!flag2&&!flag3) { cout<<"impossible"<<endl; continue; } } }