问题分析
该题的目的是给了我们一些路径 让我们将其转化为合法路径
../ 表示的是上一级
./ 表示的是当前目录
否则 要将其添加到路径中 得到的路径为cur
重点分析 :
1. 如果需要修订的路径是相对路径 需要考虑第一行给定的当前路径 cur
如果需要修订的路径是绝对路径 就不用考虑第一行给定的当前路径 ab
用vector 存放那些不需要的/ 路径
2. 若当前cur 为空 则输出根路径即可
否则 依次输出当前cur里的路径
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
vector<string> get(string& str)
{
vector<string> res;
for(int i = 0; i<str.size(); i++)
{
if(str[i] == '/') continue;
int j = i+1;
while(j<str.size() && str[j] != '/') j++;
res.push_back(str.substr(i,j-i));
i = j;
}
return res;
}
void walk(vector<string> cur, vector<string> path)
{
for(auto p:path)
{
if(p == ".") continue;//"."表示本目录,例如 /d1/./f1 指定的就是 /d1/f1,直接过滤掉即可
if(p == "..")//".."表示返回上级目录
{
if(cur.size()) cur.pop_back();//删除当前最后的目录,即返回上层目录
}
else cur.push_back(p);//存到当前目录里面
}
if(cur.size()==0)//如果cur为空,即当前目录为根目录,输出"/"
{
puts("/");
return;
}
for(auto p:cur)
cout<<"/"<<p;
cout<<endl;
}
int main()
{
int n;
string str;
cin>>n>>str;
vector<string> cur = get(str),ap;
getchar();
while(n--)
{
getline(cin,str);
auto path = get(str);
//判断当前路径是否为绝对路径
if(str.size() && str[0] == '/') walk(ap,path);//绝对路径:以 / 符号开头,表示从根目录开始构建的路径
else walk(cur,path);//相对路径:不以 / 符号开头,表示从当前目录开始构建的路径
}
return 0;
}