CCF 201604-3 路径解析

CCF 201604-3 路径解析 传送门

没看懂题目, 感觉乱七八糟的, 这是什么规则, 怎么看不懂啊? 无奈之下搜了搜题解, 自己按照大佬的方法做了一次, 觉得好像真是那么回事. 大概是因为没有路径查询的相关经验吧, 所以看题的时候会无法理解一些反常识的操作. 会觉得莫名其妙.

总之, 方法就是如果查询的路径是相对路径, 那么把它添加到当前目录里面去, 绝对路径不变.

然后对新的路径进行正规化处理, 以有一个或多个/作为分隔符, 遇到.就直接跳过去, 这里不太好理解, 这样的话这个.有什么用? 遇到..就把最后一个元素删除, 嗯, 就是类似栈的操作. 其余的都加入到栈中.

要注意的是可能会读取空字符查询, 而普通的cin是会忽略的, 所以用getline来读取一行. 代码中非常巧妙地用了stringstream来处理, 十分值得借鉴学习.

代码只有三十多行, 理解了题目意思就很简单了, 如果理解不了(比如我), 就会一头雾水. 话说这是我的锅还是CCF的锅?

#include <vector>
#include <iostream>
#include <sstream>
using namespace std;

int main()
{
    int n;
    cin >> n;
    string path, s, str;
    cin >> path;
    cin.get();  // 用getline时千万要注意吸收这个换行符
    for (int i = 0; i < n; ++i) {
        getline(cin, str);
        if (str == "") str = path;
        if (str[0] != '/') str = path + '/' + str;
        for (int j = 0; j < str.size(); ++j) {
            if (str[j] == '/') str[j] = ' ';
        }
        vector<string> sta;
        stringstream ss(str);
        while (ss >> s) {
            if (s == ".") continue;
            else if (s == ".." && !sta.empty()) sta.pop_back();
            else if (s != "..") sta.push_back(s);
        }
        cout << '/';
        for (int j = 0; j < sta.size(); ++j) {
            if (j) cout << '/';
            cout << sta[j];
        }
        cout << endl;
    }
}

对了, 用getline注意吸收前面的换行符.

猜你喜欢

转载自blog.csdn.net/wjh2622075127/article/details/81534470