路径解析
Examples
题目分析
- 这是一道t3,所以要设计好解题框架
- 首先是路径采用字符串数组来描述
- 首先将输入的当前目录进行存储,然后对输入的路径进行正规化操作
void tran(const string& s)
{
if (s.empty()||s.at(0)==' ')//判断是否为空
{
for (int i = 0; i < cur_dir.size(); i++)
ori_dir.push_back(cur_dir[i]);
}
else if (s.at(0) == '/')//绝对路径
{
ori_dir.push_back("/");
int start = 1, end = 1;
while (end != s.size())
{
if (s.at(end) == '/')
{
if (s.at(start) == '/')//去除多个'/'
start++;
else
{
check = s.substr(start, end - start);
if (check == "..") {
if(ori_dir.back() != "/")
ori_dir.pop_back();
}
else if (check == ".");
else
ori_dir.push_back(s.substr(start, end - start));
start = end + 1;
}
}
end++;
}
}
else//相对路径
{
for (int i = 0; i < cur_dir.size(); i++)
ori_dir.push_back(cur_dir[i]);
int start = 0, end = 0;
while (end != s.size())
{
if (s.at(end) == '/')
{
if (s.at(start) == '/')
start++;
else {
check = s.substr(start, end - start);
if (check == "..") {
if (ori_dir.back() != "/")
ori_dir.pop_back();
}
else if (check == ".");
else
ori_dir.push_back(s.substr(start, end - start));
start = end + 1;
}
}
end++;
}
}
}
完整代码
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int P;
string temp;
vector<string> cur_dir;
string tem_dir;
vector<string> ori_dir;
string check;
void tran(const string& s)
{
if (s.empty()||s.at(0)==' ')
{
for (int i = 0; i < cur_dir.size(); i++)
ori_dir.push_back(cur_dir[i]);
}
else if (s.at(0) == '/')
{
ori_dir.push_back("/");
int start = 1, end = 1;
while (end != s.size())
{
if (s.at(end) == '/')
{
if (s.at(start) == '/')
start++;
else
{
check = s.substr(start, end - start);
if (check == "..") {
if(ori_dir.back() != "/")
ori_dir.pop_back();
}
else if (check == ".");
else
ori_dir.push_back(s.substr(start, end - start));
start = end + 1;
}
}
end++;
}
}
else
{
for (int i = 0; i < cur_dir.size(); i++)
ori_dir.push_back(cur_dir[i]);
int start = 0, end = 0;
while (end != s.size())
{
if (s.at(end) == '/')
{
if (s.at(start) == '/')
start++;
else {
check = s.substr(start, end - start);
if (check == "..") {
if (ori_dir.back() != "/")
ori_dir.pop_back();
}
else if (check == ".");
else
ori_dir.push_back(s.substr(start, end - start));
start = end + 1;
}
}
end++;
}
}
}
int main()
{
cin >> P;
cin >> temp;
temp.push_back('/');
cur_dir.push_back("/");
int start1 = 1, end1 = 1;
while (end1 != temp.size())
{
if (temp.at(end1) == '/')
{
cur_dir.push_back(temp.substr(start1, end1 - start1));
start1 = end1 + 1;
}
end1++;
}
getchar();
while (P--)
{
getline(cin,tem_dir);
if(!tem_dir.empty())
tem_dir.push_back('/');
tran(tem_dir);
cout << '/';
for (int i = 1; i < ori_dir.size() - 1; i++)
cout << ori_dir[i] << '/';
if (ori_dir.size() != 1)
cout << ori_dir.back();
cout << endl;
ori_dir.clear();
}
return 0;
}
note
注意一下特殊要求,比如名称带…和.或者时字符串为空之类的。