201604-3【路径解析】

题意:
201604-3【路径解析】_第1张图片

201604-3【路径解析】_第2张图片
201604-3【路径解析】_第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<string> vet;

int main() {
	cin >> p;
	cin >> str;
	cin.get();

	for (int i = 0; i < p; i++)
	{
		string s, t;
		vector<string> 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;
}

你可能感兴趣的:(CSP模测)