UVA11995 I Can Guess the Data Structure! ADT+STL
阿新 • • 發佈:2018-12-16
題意翻譯
猜猜資料結構
試題描述:
你有一個類似“包包”的資料結構,支援兩種操作,如下表所示。 1x:把元素x放進包包 2:從包包中拿出一個元素 給出一系列操作以及返回值,你的任務是猜猜這個“包包”到底是什麼。它可能是一個棧<後進先出),佇列(先進先出),優先佇列(數值大的整數先出)或者其他什麼奇怪的東西。
輸入:
第一行為一個整數n(1≤n≤1 000)。以下n行每行要麼是一條型別1的命令,要麼是一條型別2的命令後面跟著一個整數x(1≤x≤100)。這個整數x表示執行完這條型別2的命令後,包包無錯地返回了x。輸入檔案大小不超過1MB。
輸出:
輸出一行。一共有5種可能的輸出。
stack:一定是一個棧
queue:一定是一個佇列
priority queue:一定是一個優先佇列
impossible:一定不是以上三種
not sure:至少有兩種是可能的
輸入示例:
5 1 5 1 3 1 2 2 2 2 3
輸出示例:
stack
題目描述
輸入輸出格式
輸入格式:
輸出格式:
輸入輸出樣例
輸入樣例#1: 複製
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
輸出樣例#1: 複製
queue not sure impossible stack priority queue
分析:
簡單模擬就行
#include<vector> #include<cstdio> #include<stack> #include<queue> using namespace std; struct Data_Struct { //vc存放指令pair序列 vector<pair<int,int> > vc; //建構函式 Data_Struct(int n) { for(int i=0;i<n;i++) { int x,y; scanf("%d%d",&x,&y); vc.push_back(make_pair(x,y)); } } //判斷是否可能是一個棧 bool is_stack() { stack<int> S; for(int i=0;i<vc.size();i++) { int x=vc[i].first, y=vc[i].second; if(x==1) S.push(y); else if(x==2) { if(S.empty() || S.top()!=y ) return false; S.pop(); } } return true; } //判斷是否可能是一個佇列 bool is_queue() { queue<int> Q; for(int i=0;i<vc.size();i++) { int x=vc[i].first, y=vc[i].second; if(x==1) Q.push(y); else if(x==2) { if(Q.empty() || Q.front()!=y ) return false; Q.pop(); } } return true; } //判斷是否可能是一個優先佇列 bool is_priority_queue() { priority_queue<int> Q; for(int i=0;i<vc.size();i++) { int x=vc[i].first,y=vc[i].second; if(x==1) Q.push(y); else { if(Q.empty() || Q.top()!=y )return false; Q.pop(); } } return true; } //輸出整合後的結果 void solve() { int S=is_stack(), Q=is_queue(), PQ=is_priority_queue(); if(S+Q+PQ==0) printf("impossible\n"); else if(S+Q+PQ==1) { if(S) printf("stack\n"); else if(Q) printf("queue\n"); else if(PQ) printf("priority queue\n"); } else if(S+Q+PQ>1) printf("not sure\n"); } }; int main() { int n; while(scanf("%d",&n)==1) { Data_Struct ds(n); ds.solve(); } return 0; }