题目描述
你有一个奇怪的数据结构,他可能是栈(stack),队列(queue),优先队列(priority_queue),或者其他什么奇怪的东西。
假设有n个元素依次进入这个数据结构,并且知道这些元素出去的顺序,你能告诉我这个数据结构是什么吗?
输入
输入包括多组测试数据,每组测试数据的第一行为一个正整数n(1<=n<=1000),第二行包括n个整数代表进入的顺序,第三行也有n个整数代表出去的顺序。
输出
对于每组测试数据,输出可能的数据结构名字。如果有多个数据结构满足,则按顺序输出。若没有数据结构满足,则输出“none”。
样例输入
3
1 2 3
1 2 3
3
1 2 1
1 2 1
样例输出
queue priority_queue
stack queue
注释:注意要清空容器。
代码:
#include<bits/stdc++.h>
using namespace std;
stack<int>a;
queue<int>b;
vector<int>v1;
vector<int>v2;
priority_queue<int>c;//默认大顶堆,从大到小。
priority_queue<int,vector<int>,greater<int> >d;//小顶堆,从小到大。
int n;
int main(){
while(~scanf("%d",&n)){
for(int i=0;i<n;i++){
int x;
scanf("%d",&x);
v1.push_back(x);
a.push(x);
b.push(x);
c.push(x);
d.push(x);
}
for(int i=0;i<n;i++){
int x;
scanf("%d",&x);
v2.push_back(x);
}
int a1=1,b1=1,c1=1,d1=1;
for(vector<int>::iterator it=v2.begin();it!=v2.end();it++){
if(*it!=a.top()){
a1=0;break;
}
else{
a.pop();
}
}
for(vector<int>::iterator it=v2.begin();it!=v2.end();it++){
if(*it!=b.front()){
b1=0;break;
}
else{
b.pop();
}
}
for(vector<int>::iterator it=v2.begin();it!=v2.end();it++){
if(*it!=c.top()){
c1=0;break;
}
else{
c.pop();
}
}
for(vector<int>::iterator it=v2.begin();it!=v2.end();it++){
if(*it!=d.top()){
d1=0;break;
}
else{
d.pop();
}
}
int sum=0;
if(a1){
if(sum==0){
printf("stack");sum++;
}
else{
printf(" stack");sum++;
}
}
if(b1){
if(sum==0){
printf("queue");sum++;
}
else{
printf(" queue");sum++;
}
}
if(c1||d1){
if(sum==0){
printf("priority_queue");sum++;
}
else{
printf(" priority_queue");sum++;
}
}
if(a1==0&&b1==0&&c1==0&&d1==0)printf("none");
printf("\n");
while(!a.empty()){
a.pop();
}
while(!b.empty()){
b.pop();
}
while(!c.empty()){
c.pop();
}
while(!d.empty()){
d.pop();
}
v1.clear();
v2.clear();
}
}