uva 11995 - I Can Guess the Data Structure!
March 16, 2013
Uva
There is a bag-like data structure, supporting two operations: Throw an element x into the bag. 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! 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. For each test case, output one of the following: It’s definitely a stack. It’s definitely a queue. It’s definitely a priority queue. It can’t be a stack, a queue or a priority queue. It can be more than one of the three data structures mentioned above.
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <stack>
#include <queue>
#include <iostream>
using namespace std;
struct data{
int v; int k;
friend bool operator < (data a, data b){
return a.v < b.v;
}
}s[1000+10];
int n;
int cstack(){
stack<int> qq;
for (int i = 0; i < n; ++i){
if (s[i].k == 1) qq.push(s[i].v);
if (s[i].k == 2) {
if (qq.empty() == 1) return 0;
if (qq.top() == s[i].v) {
qq.pop(); continue;
}
else return 0;
}
}
return 1;
}
int cqueue(){
queue<int> qq;
for (int i = 0; i < n; ++i){
if (s[i].k == 1) qq.push(s[i].v);
if (s[i].k == 2){
if (qq.empty() == 1) return 0;
if (qq.front() == s[i].v) {
qq.pop(); continue;
}
else return 0;
}
}
return 1;
}
int cpriqueue(){
priority_queue<data> qq;
for (int i = 0; i < n; ++i){
if (s[i].k == 1) qq.push(s[i]);
if (s[i].k == 2) {
if (qq.empty() == 1) return 0;
if (qq.top().v == s[i].v) {
qq.pop(); continue;
}
else return 0;
}
}
return 1;
}
int main(void){
#ifndef ONLINE_JUDGE
freopen("11995.in", "r", stdin);
#endif
while (~scanf("%d", &n)){
for (int i = 0; i < n; ++i){
scanf("%d%d", &s[i].k, &s[i].v);
}
int st = cstack(), qu = cqueue(), pri = cpriqueue();
if (st + qu + pri > 1) printf("not sure\n");
else if (st) printf("stack\n");
else if (qu) printf("queue\n");
else if (pri) printf("priority queue\n");
else printf("impossible\n");
}
return 0;
}
关键是学会STL的使用,然后,还有结构体里面的友元函数,用来优先队列实现里面判断大小,注意,参数列表不能用 data &a, data &b会报错,看来C++语法还得复习一下啊……