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++语法还得复习一下啊……

comments powered by Disqus