T02775: 文件结构“图”
tree, http://cs101.openjudge.cn/practice/02775/
思路:用栈维护当前目录层次,每遇到目录就入栈、遇到 ] 出栈,递归输出目录与文件。
cpp
#include <iostream>
#include <vector>
#include <string>
#include <stack>
#include <algorithm>
using namespace std;
bool isDir(const string& name) {
return !name.empty() && name[0] == 'd';
}
void dfs(int dir, const string& prefix,
const vector<string>& name,
const vector<vector<int>>& subdirs,
const vector<vector<string>>& subfiles) {
cout << prefix << name[dir] << "\n";
string subprefix = prefix + "| ";
for (int subdir : subdirs[dir]) {
dfs(subdir, subprefix, name, subdirs, subfiles);
}
vector<string> files = subfiles[dir];
sort(files.begin(), files.end());
for (const string& f : files) {
cout << prefix << f << "\n";
}
}
bool solve(int cas) {
int id = 0;
vector<string> name(1, "ROOT");
vector<vector<int>> subdirs(1);
vector<vector<string>> subfiles(1);
stack<int> stk;
stk.push(0);
string line;
while (true) {
if (!getline(cin, line))
return false;
if (line == "#") return false;
if (line == "*") break;
if (isDir(line)) {
++id;
name.push_back(line);
subdirs.push_back({});
subfiles.push_back({});
subdirs[stk.top()].push_back(id);
stk.push(id);
} else if (line == "]") {
stk.pop();
} else {
subfiles[stk.top()].push_back(line);
}
}
cout << "DATA SET " << cas << ":\n";
dfs(0, "", name, subdirs, subfiles);
cout << "\n";
return true;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int cas = 1;
while (solve(cas)) {
++cas;
}
return 0;
}