题意:
给你当前的路径(已经正规化),再给你一些需要正规化的路径,求出它们经过正规化操作后的路径。
题解:
根据不同情况,直接把当前路径和需要正规化的路径拼接起来。
代码如下:
解法1:
#include<bits/stdc++.h>
using namespace std;
int n;
deque<string>dqu;
void print(){
if(!dqu.size()){
printf("/\n");
return;
}
while(!dqu.empty()){
printf("/%s",dqu.front().c_str());dqu.pop_front();
}printf("\n");
}
void deal(string s){
int i,lenS;
string tmpS;
tmpS="";i=0;lenS=s.size();
while(!dqu.empty())dqu.pop_front();
while(i<lenS){
while(i<lenS&&(s[i]=='/'))i++;
if(i>=lenS)break;
tmpS="";
while(i<lenS&&(s[i]!='/'))tmpS+=s[i],i++;
if(tmpS=="")break;
if(tmpS==".");
else if(tmpS==".."){
if(!dqu.empty())dqu.pop_back();
}
else dqu.push_back(tmpS);
}
print();
}
int main(){
string s,path,s2;
while(cin>>n){
getchar();
getline(cin,path);
while(n--){
getline(cin,s);
if(s=="")s2=path;
else if(s[0]!='/')s2=path+"/"+s;
else s2=s;
deal(s2);
}
}
return 0;
}
解法2:
#include <bits/stdc++.h>
using namespace std;
int n;
vector<string>vec;
int main(){
int i,lenV,lenS;
string str,s,path;
while(cin>>n){
getchar();
getline(cin,path);
while(n--){
getline(cin,str);
if(str=="")str=path;
else if(str[0]!='/')str=path+"/"+str;
vec.clear();lenS=str.size();
for (i=0;i<lenS;i++)if(str[i]=='/')str[i]=' ';
stringstream ss(str);
while(ss>>s){
if(s==".")continue;
else if(s==".."){
if(!vec.empty())vec.pop_back();
}
else vec.push_back(s);
}
printf("/");
lenV=vec.size();
for (i=0;i<lenV;i++){
if(i!=0)printf("/");
printf("%s",vec[i].c_str());
}
printf("\n");
}
}
return 0;
}