201604-3【路径解析】

【201604-3【路径解析】】题意:
201604-3【路径解析】
文章图片

201604-3【路径解析】
文章图片

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; }

    推荐阅读