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!
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:
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.
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; }