【201604-3【路径解析】】题意:
文章图片
文章图片
文章图片
思路:
由于遇到"…/"的时候要退到上一级目录,也就是要把自己上一次写的目录删除一个,所以我用vector来存储每行的字符串,用push_back()和pop_back()来进行插入和删除。
采用如下方式进行分割字符串
string s;
cin >> s;
stringstream ss(s);
while(getline(ss,t,’/’)){ cout << t << endl;
}
代码:
#include using namespace std;
int p;
string str;
vector> vet;
int main() {
cin >> p;
cin >> str;
cin.get();
for (int i = 0;
i < p;
i++)
{
string s, t;
vector> vec;
getline(cin, s);
if (s == "") {
s = str;
}
else if (s[0] != '/') {//相对路径处理,加上当前目录
s = str + '/' + s;
}stringstream ss(s);
while (getline(ss, t, '/')) {
if (t != "" && t != ".") {
if (t == ".." && !vec.empty()) {//退一级目录
vec.pop_back();
}
else if (t != "..") {//此处千万记得判断,还有vec为empty的时候,如/d1/../../d2第二个..就是空的,把..加了进去
vec.push_back(t);
}
}
}
t = "";
for (int j = 0;
j < vec.size();
j++) {
t += '/' + vec[j];
}
vet.push_back(t);
} for (int i = 0;
i < vet.size();
i++) {
if (vet[i] == "") {//如果一行都是///,则输出时加上/
cout << "/" << endl;
}
else {
cout << vet[i] << endl;
}
} return 0;
}