版权声明: https://blog.csdn.net/leelitian3/article/details/82463213
大致思路
①预处理当前目录
将当前目录的路径都保存在一个vector<string> vec_cur中:将"/"替换为" ",然后用字符串流即可
②预处理给定目录
1.将"//"全部删除,将"/./"替换为"/"
2.若给定目录为绝对路径:类似于①中方法将路径保存至vector<string> path中,其中遇到".."时将vector的最后一个元素删除即可;
若给定目录为相对路径,令path = vec_cur,再将其当做绝对路径处理。
C++满分代码
#include <iostream>
#include <vector>
#include <cstring>
#include <sstream>
using namespace std;
int p;
string cur,input,tmp;
vector<string> path;
vector<string> vec_cur;
void deal_cur()
{
tmp = cur;
for(size_t i=0; i<cur.size(); ++i)
if(tmp[i] == '/') tmp[i] = ' ';
stringstream ss(tmp);
while(ss>>tmp)
vec_cur.push_back(tmp);
}
void deal_input()
{
path.clear();
size_t p;
while((p=input.find("//")) != string::npos)
input.erase(p,2);
while((p=input.find("/./")) != string::npos)
input.replace(p,3,"/");
if(input[0] != '/') path = vec_cur;
for(size_t i=0; i<input.size(); ++i)
if(input[i] == '/') input[i] = ' ';
stringstream ss(input);
while(ss>>tmp)
{
//cout<<"tmp:"<<tmp<<"\n";
if(tmp == "..")
{
if(!path.empty()) path.pop_back();
}
else path.push_back(tmp);
}
}
void print()
{
if(!path.empty())
{
for(int i=0; i<path.size(); ++i)
cout<<"/"<<path[i];
}
else cout<<"/";
cout<<"\n";
}
int main()
{
cin>>p;
cin.get();
getline(cin,cur);
deal_cur();
while(p--)
{
getline(cin,input);
deal_input();
print();
}
return 0;
}