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题目大意:给你一个移动方式,判断它是队列,栈,还是优先队列。
解题思路:直接用STL里面的队列,栈,和优先队列去模拟,出现矛盾说明不是(做这题的时候还没有接触优先队列,所以用数组+sort写了)。
#include <stdio.h>
#include <string.h>
#include <stack>
#include <queue>
#include <algorithm>
using namespace std;
#define N 100005
int main(){
int n, cnt, num[N];
int ok_que, ok_sta, ok_per;
int t, k, f;
while (scanf("%d", &n) != EOF){
// Init;
memset(num, 0, sizeof(num));
ok_que = ok_sta = ok_per = 1;
cnt = 0;
queue<int> que;
stack<int> sta;
for (int i = 0; i < n; i++){
scanf("%d%d", &t, &k);
if (t == 1){
que.push(k);
sta.push(k);
num[cnt++] = k;
}
else if (t == 2){
if (que.empty() || que.front() != k){
ok_que = 0;
}
else
que.pop();
if (sta.empty() ||sta.top() != k){
ok_sta = 0;
}
else
sta.pop();
if (cnt){
sort(num, num + cnt);
if (num[cnt - 1] != k)
ok_per = 0;
else
cnt--;
}
else
ok_per = 0;
}
}
if (ok_que + ok_sta + ok_per > 1)
printf("not sure\n");
else if (ok_que)
printf("queue\n");
else if(ok_sta)
printf("stack\n");
else if(ok_per)
printf("priority queue\n");
else
printf("impossible\n");
}
return 0;
}