csp201604 - 3 路径解析

题意解法

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

做本题时考虑:

  1. 应该如何将多余的/省略
  2. 使用什么数据结构来处理文件路径
  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;

}