# Stack# Queue# Priority Queue# Simulation

e548 - 11995 - I Can Guess the Data Structure!

🔗 前往 ZeroJudge 原題

題目描述

題目給定一系列的插入和刪除操作,要求判斷這些操作所對應的資料結構是堆疊 (Stack)、佇列 (Queue) 還是優先權佇列 (Priority Queue)。如果無法確定,則輸出 "not sure",如果以上三種都不符合,則輸出 "impossible"。

解題思路

這題的核心在於模擬三種資料結構的操作,並檢查給定的操作序列是否符合這些資料結構的特性。對於每一組輸入,我們分別使用堆疊、佇列和優先權佇列來模擬操作。如果在任何時刻,某種資料結構的操作與輸入不符,則將該資料結構的可能性標記為 false。最後,根據三種資料結構的可能性來判斷輸出結果。如果只有一種資料結構的可能性為 true,則輸出該資料結構的名稱。如果有多種可能性為 true,則輸出 "not sure"。如果三種可能性都為 false,則輸出 "impossible"。

複雜度分析

  • 時間複雜度: O(n),其中 n 是操作的數量。因為我們需要遍歷所有操作並模擬三種資料結構。
  • 空間複雜度: O(n),因為在最壞的情況下,三種資料結構都需要儲存所有輸入的元素。

程式碼

#include <iostream>
#include <stack>
#include <queue>
using namespace std;
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	int n,is,v;
	while(cin >> n){
		bool s=1,q=1,p=1;
		stack <int> ss;
		queue <int> qq;
		priority_queue <int> pp;
		for(int i=0;i<n;++i){
			cin >> is >> v;
			if(is==1){
				if(s)
					ss.push(v);
				if(q)
					qq.push(v);
				if(p)
					pp.push(v);
			}
			else{
				if(s){
					if(ss.empty()||ss.top()!=v)
						s=0;
					else
						ss.pop();
				}
				if(q){
					if(qq.empty()||qq.front()!=v)
						q=0;
					else
						qq.pop();
				}
				if(p){
					if(pp.empty()||pp.top()!=v)
						p=0;
					else
						pp.pop();
				}
			}
		}
		if(s+q+p>1)
			cout << "not sure\n";
		else if(s+q+p==0)
			cout << "impossible\n";
		else if(s)
			cout << "stack\n";
		else if(q)
			cout << "queue\n";
		else if(p)
			cout << "priority queue\n";
	}
}

Discussion