編程題#2: 文件結構“圖”
來源: POJ (Coursera聲明:在POJ上完成的習題將不會計入Coursera的最後成績。)
注意: 總時間限制: 1000ms 內存限制: 65536kB
描述
在計算機上看到文件系統的結構通常很有用。Microsoft Windows上面的”explorer”程序就是這樣的一個例子。但是在有圖形界面之前,沒有圖形化的表示方法的,那時候最好的方式是把目錄和文件的結構顯示成一個”圖”的樣子,而且使用縮排的形式來表示目錄的結構。比如:
ROOT
| dir1
| | file1
| | file2
| | file3
| dir2
| dir3
| | file1
file1
file2
這個圖說明:ROOT目錄包括兩個文件和三個子目錄。第一個子目錄包含3個文件,第二個子目錄是空的,第三個子目錄包含一個文件。
輸入
你的任務是寫一個程序讀取一些測試數據。每組測試數據表示一個計算機的文件結構。每組測試數據以’*’結尾,而所有合理的輸入數據以’#’結尾。一組測試數據包括一些文件和目錄的名字(雖然在輸入中我們沒有給出,但是我們總假設ROOT目錄是最外層的目錄)。在輸入中,以’]’表示一個目錄的內容的結束。目錄名字的第一個字母是’d’,文件名字的第一個字母是’f’。文件名可能有擴展名也可能沒有(比如fmyfile.dat和fmyfile)。文件和目錄的名字中都不包括空格。
輸出
在顯示一個目錄中內容的時候,先顯示其中的子目錄(如果有的話),然後再顯示文件(如果有的話)。文件要求按照名字的字母表的順序顯示(目錄不用按照名字的字母表順序顯示,只需要按照目錄出現的先後顯示)。對每一組測試數據,我們要先輸出”DATA SET x:”,這裏x是測試數據的編號(從1開始)。在兩組測試數據之間要輸出一個空行來隔開。
你需要注意的是,我們使用一個’|’和5個空格來表示出縮排的層次。
樣例輸入
file1
file2
dir3
dir2
file1
file2
]
]
file4
dir1
]
file3
*
file2
file1
*
#
樣例輸出
DATA SET 1:
ROOT
| dir3
| | dir2
| | file1
| | file2
| dir1
file1
file2
file3
file4
DATA SET 2:
ROOT
file1
file2
提示
一個目錄和它的子目錄處於不同的層次
一個目錄和它的裏面的文件處於同一層次
程序解答:
#include <iostream>
#include <string>
#include <set>
using namespace std;
int n = 0;//層數
int m = 1;//第幾組數據
bool have_print;
bool stop = false;
void print(){
if (have_print == false){
have_print = true;
if (m != 1)
cout << endl;
cout << "DATA SET " << m << ":" << endl << "ROOT" << endl;
}
}
void fun(void){
string str;
set<string> s;
while (cin >> str){
switch (str[0]){
case '#':
stop = true;
return;
case 'f':
print();
s.insert(str);
break;
case 'd':
print();
n++;
for (int i = 0; i<n; i++){
cout << "| ";
}
cout << str << endl;
fun();
break;
case ']':
for (set<string>::iterator i = s.begin(); i != s.end(); i++){
for (int j = 0; j<n; j++){
cout << "| ";
}
cout << *i << endl;
}
n--;
return;
case '*':
for (set<string>::iterator i = s.begin(); i != s.end(); i++){
cout << *i << endl;
}
m++;
return;
}
}
}
int main(){
while (!stop){
have_print = false;
fun();
}
return 0;
}