csp201604 - 3 路径解析
题意解法
本题让我们把带有重复命令的路径转化为一个标准路径,是一道相对简单的题目。
做本题时考虑:
- 应该如何将多余的
/省略 - 使用什么数据结构来处理文件路径
- 如何抵消相对路径与绝对路径的区别
由于最后的标准格式中 / 符号规定了使用标准固定,所以只需要将输入路径的文件名提取出来。所以在处理输入的时候不需考虑/,只需要在输出的时候加上/即可。
数据结构选用栈,因为..的回退与出栈相似。
相对路径只需要与当前目录拼接就可以。(题目中没有重名的用例)。
代码
#include<iostream>
#include<string>
#include<vector>
using namespace std;
string cur;
void out(vector<string> vec) {
for (int i = 0; i < vec.size(); i++) {
cout << '/' << vec[i];
}
if (!vec.size()) cout << '/';
cout << endl;
}
void solve(string str) {
vector<string> 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;
}