問題描述
L正在出題,建立了一個word文檔,想不好取什麼名字,身旁一人驚問:“你出的題目叫《建立Microsoft Word文檔》嗎?”,L大喜,一拍桌子,說:“好,就叫這個名字了。”
仔細觀察,當你建立一個word文檔時,會得到一個名為“建立 Microsoft Word 文檔.doc”的檔案,再建立一個,則名為“建立 Microsoft Word 文檔(2).doc”,再建立,便是“建立 Microsoft Word 文檔(3).doc”。不斷建立,編号不斷遞增。倘若你現在建立了三個文檔,然後删除了“建立 Microsoft Word 文檔(2).doc”,再建立就又會得到一個“建立 Microsoft Word 文檔(2).doc”。
嚴格說,Windows在每次建立文檔時,都會選取一個與已有檔案編号不重複的最小正整數作為新文檔的編号。
請程式設計模拟以上過程,支援以下兩種操作
New:建立一個word文檔,回報建立的文檔的編号
Delete id:删除一個編号為id的word文檔,回報删除是否成功
初始時一個檔案都沒有,“建立 Microsoft Word 文檔.doc”的編号算作1。
輸入格式
第一行一個正整數n表示操作次數,接下來n行,每行表示一個操作。若該行為”New”,則表示建立,為”Delete id”則表示要删除編号為id的文檔,其中id為一個正整數。操作按輸入順序依次進行。
輸出格式
對于輸入的每一行,輸出其回報結果。對于建立操作,輸出建立的文檔的編号;對于删除操作,回報删除是否成功:如果删除的檔案存在,則删除成功,輸出”Successful”,否則輸出”Failed”。
樣例輸入
12
New
New
New
Delete 2
New
Delete 4
Delete 3
Delete 1
New
New
New
Delete 4
樣例輸出
1
2
3
Successful
2
Failed
Successful
Successful
1
3
4
Successful
思路:
資料結構,運用兩個棧模拟檔案的建立或者删除,另外用一個數組來标記操作是否成功。
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
int i,n,x,mark[3000]={0};
string a,b;
stack<int> k,p;
for(i=3000;i>0;i--)
k.push(i);
scanf("%d",&n);
while(n--){
cin>>a;
if(a[0]=='D'){
scanf("%d",&x);
if(mark[x]){
printf("Successful\n");mark[x]=0;
k.push(x);
}
else
printf("Failed\n");
}
else {
x=k.top();k.pop();
printf("%d\n",x);mark[x]=1;
}
}
return 0;
}