CSP-201604-3路径解析
题目具体描述不再粘贴,如有需要可参照CSP模拟考试网址。
题目分析
这道题目的思路较为简单,主要考察细心程度,不要因为考虑不全而丢分。而具体的实现其实有两种方式:
- 使用栈作为数据结构,不断地输入, 对于需要正规的符号直接忽略或者处理
- 直接根据输入进行判断,直接模拟
下面只介绍直接模拟的方法,因为思路比较直接,而且具体写起来也并不麻烦。首先需要判断路径的情况,如果是绝对路径:
- 如果是 / . / /./ /./ 直接删除 . / ./ ./
- / / // // 两个 / / / 直接删除一个
- / . . / /../ /../ 需要区分第一个/是根目录还是普通的 / . /. /.对于前者删除三个符号即可; 对于后者需要从/往前遍历,找到前一个/,将这中间的全部删去.
以上情况处理完成之后还需要考虑末尾的情况: /… /. /对于这三种情况需要从最后一个/开始都删除。
如果是相对路径:从开头添加相对路径从而转化为绝对路径。
如果是空字符串:直接输出当前路径。
下面是题目的全部代码:
#include<iostream>
using namespace std;
int main()
{
int cnt;
string path,cur;
cin>>p>>cur;
getchar();
for(int i=0;i<cnt;++i)
{
getline(cin,path);
if(path.size()==0)
{
cout<<cur<<endl;
continue;
}
if(path[0]!='/')path=cur+"/"+path;
int a;
while((a=path.find("/./"))!=-1)
path.erase(a,2);
while((a=path.find("//"))!=-1)
path.erase(a,1);
while((a=path.find("/../"))!=-1)
{
if(a==0)path.erase(0,3);
else
{
int x=path.rfind("/",a-1);
path.erase(x+1,a-x+3);
}
}
if(path.size()>1)
{
int y=path.rfind("/",path.size()-1);
if(y==path.size()-1 || path[y+1]=='.')
path.erase(y,path.size()-y);
}
cout<<path<<endl;
}
return 0;
}