201604-3 路径解析
题目
思路
半天没理解清楚".“以及”. ."的含义,思路混乱的我写了一堆if混了60分。然后我在网上看了大佬的解释,代码AC了看着也还是有点乱,暂时懒得整理了。
AC代码如下
#include<iostream>
#include<string>
#include<vector>
#include<stack>
using namespace std;
int main(){
int p;
string str,curp;
vector<string> cur,path;//用vector保存路径的文件及目录名
cin>>p;
cin.get();
cin>>curp;
int s=0;
while(s<curp.size()){//分割
int ed=curp.find('/',s);
if(ed==string::npos) ed=curp.size();//搜到头了还需要把最后一段抽出
cur.push_back(curp.substr(s,ed-s));
s=ed+1;
}
cin.get();
while(p--){
getline(cin,str);
int flag=0;
s=0;
if(str.size()==0) {//空字符串直接输出当前目录
cout<<curp<<endl;
continue;
}
if(str[0]=='/'){
flag=1;//1表示绝对路径
s=1;
}
while(s<str.size()){//分割
int ed=str.find('/',s);
if(ed==string::npos) ed=str.size();
else if(ed==s) {
str.erase(ed,1);
continue;
}
path.push_back(str.substr(s,ed-s));
s=ed+1;
}
if(path.size()==0){//如果是根目录,直接输出
cout<<'/'<<endl;
continue;
}
vector<string> ans;
if(flag==0) ans=cur;
for(int i=0;i<path.size();i++){//分析
if(path[i]==".") continue;
else if(path[i]==".."){
if(!ans.empty()) ans.pop_back();//返回上一级目录
}
else ans.push_back(path[i]);
}
//输出
if(flag) cout<<'/'<<ans[0];
for(int i=1;i<ans.size();i++) cout<<'/'<<ans[i];
cout<<endl;
path.clear();
}
return 0;
}