csp201604 - 3 路径解析

题意解法

本题让我们把带有重复命令的路径转化为一个标准路径,是一道相对简单的题目。

做本题时考虑:

  1. 应该如何将多余的/省略
  2. 使用什么数据结构来处理文件路径
  3. 如何抵消相对路径与绝对路径的区别

由于最后的标准格式中 / 符号规定了使用标准固定,所以只需要将输入路径的文件名提取出来。所以在处理输入的时候不需考虑/,只需要在输出的时候加上/即可。

数据结构选用栈,因为..的回退与出栈相似。

相对路径只需要与当前目录拼接就可以。(题目中没有重名的用例)。

代码

include

include

include

using namespace std;

string cur;

void out(vector vec) {
for (int i = 0; i < vec.size(); i++) {
cout << '/' << vec[i];
}
if (!vec.size()) cout << '/';
cout << endl;
}

void solve(string str) {
vector eles;
string n = "";
for (int i = 0; i < str.size(); i++) {

if (str[i] == '/') {
if (!n.size()) continue;
else if (n == ".") {
n = "";
continue;
}
else if (n == "..") {
if (eles.size()) eles.pop_back();
}
else {
eles.push_back(n);
}
n = "";
}
else n += str[i];
}
if (n == ".." && eles.size()) eles.pop_back();
if (n != "." && n != ".." && n != "/" && n.size())eles.push_back(n);
out(eles);
}

int main() {
int n; cin >> n;
cin >> cur;
getchar();
for (int i = 0; i < n; i++) {
string l;
getline(cin, l);
if (!l.size()) {
cout << cur << endl;
continue;
}
if (l[0] == '/') {
solve(l);
}
else {
string n = "";
n += cur; n += '/'; n += l;
solve(n);
}
}

return 0;

}