定义结构体
struct Dir
{
vector< Dir > dir;
vector< string > file;
};
通过递归处理, 和输出 就很方便了。
要注意,当出现子目录时,递归下去处理,回朔后再将其加入到父目录的vector中,不然没有保存到之后的信息。
解题代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<algorithm> #include<iostream> #include<vector> #include<string> #include<stdio.h> using namespace std; struct Dir { string name; vector<Dir> d; vector<string> f; }; void solve( Dir &rt, string s ) { if( (s.at(0) == '*') || (s.at(0) == ']') ) return; else if( s.at(0) == 'f' ) { rt.f.push_back(s); cin >> s; solve( rt, s ); } else{ Dir sub;sub.name = s; cin >> s; solve( sub, s ); rt.d.push_back(sub); cin >> s; solve( rt, s ); } } void print(int floor) { for(int i = 0; i < floor; i++) cout << "| " ; } void fuck( Dir &rt, int floor ) { //首先输出x本身目录名 print(floor); cout << rt.name << endl; //对于处在floor层的当前目录x,首先输出其子目录 for(int i = 0; i < rt.d.size(); i++) { fuck( rt.d[i], floor+1 ); } //按字典序号输出文件 sort( rt.f.begin(), rt.f.end() ); for(int i = 0; i < rt.f.size(); i++) { print(floor); cout << rt.f[i] << endl; } } int main() { int T = 1; string s; while( 1 ) { cin >> s; if( s.at(0) == '#' ) break; Dir rt; rt.name = "ROOT"; solve( rt, s ); cout << "DATA SET " << T++ << ":" << endl; fuck( rt, 0 ); cout << endl; } return 0; }