您的位置:首页 > 编程语言 > C语言/C++

CSP考试 2016年04月第3题 路径解析 C++实现

2016-07-03 15:59 477 查看




//. 表示本目录,例如 /d1/./f1 指定的就是 /d1/f1
//如果有多个连续的 / 出现,其效果等同于一个 /
//绝对路径:以 / 符号开头,表示从根目录开始构建的路径。
//相对路径:不以 / 符号开头,表示从当前目录开始构建的路径。
//.. 表示上一级目录。 . 表示本目录
#include <iostream>
#include <string>
//#include <cstring>
//假设当前目录是标准的
//考虑所有字符串
//70分 修改版
//若路径为空字符串,则正规化操作的结果是当前目录。
//80分 修改版
//.. 表示上一级目录
// . 表示本目录
//对于前 60% 的测试用例,需要正规化的路径都是绝对路径。
//输入../..
//输出/d2/..
//修改版 使用栈 + substr repace
//90分 运行错误
// 1
// /d2/d3
// /../...
// /..
using namespace std;
int main()
{
int NUM;
cin>>NUM;
string a[NUM];
string b;//输入的当前目录保证是一个经过正规化操作后的路径。
cin>>b;
string dj;
getline(cin,dj);
int i;
for(i=0;i<NUM;i++)
{
//cin>>a[i];
getline(cin,a[i]);
}
//string c[NUM];
int m;
for(m=0;m<NUM;m++)
{
//实验第1个字符串
//允许出错
//绝对路径:以 / 符号开头,表示从根目录开始构建的路径。
//相对路径:不以 / 符号开头,表示从当前目录开始构建的路径。
//当前目录能为空吗
if(b=="")
{
b="/";
}
if(a[m]=="")
{
a[m]=b;//若路径为空字符串,则正规化操作的结果是当前目录
//continue;
}
if(a[m][0]!='/')
{
a[m]=b+'/'+a[m];
}
//cout<<a[m]<<endl;
int j=0;
for(i=0;i<a[m].size();i++)//去掉多余的'/'
{
if(a[m][i]!='/')
{
a[m][j]=a[m][i];
j++;
}else if((a[m][i]=='/')&&(a[m][i+1]!='/'))
{
a[m][j]=a[m][i];
j++;
}
}
for(i=j;i<a[m].size();i++)
{
a[m][i]=0;
}
//正规化操作要去掉结尾的 /
if(a[m][a[m].size()-1]=='/')
{
a[m][a[m].size()-1]=0;
}
//cout<<a[m]<<endl;
//. 表示本目录
//将"/./"用"/"替代
// 1
// /
// .
// /. 解决
//也许还有问题
//当前目录能为空吗
j=0;
for(i=0;i<a[m].size();i++)
{
if((a[m][i]=='/')&&(a[m][i+1]=='.')&&((a[m][i+2]=='/')||(a[m][i+2]=='\0')))// "/./" "/."
{
//a[0][j]=a[0][i];
//j++;
i=i+1;
}else
{
a[m][j]=a[m][i];
j++;
}
}
for(i=j;i<a[m].size();i++)
{
a[m][i]=0;
}
if(a[m][0]=='\0')
{
a[m][0]='/';
}
//cout<<a[m]<<endl;
//处理"/../" 90分 运行错误
// 1
// /d2/d3
// ../../../d4/../..
//运行错误 解决
// 1
// /
// ..
// /.. 解决
// .. 表示上一级目录
// 90分 错误
//cout<<a[m]<<endl;
int zhan[1000];
for(i=0;i<1000;i++)
{
zhan[i]=0;
}
//memset(zhan,0,sizeof(zhan));
int top=-1;
for(i=0;i<a[m].size();i++)
{
//cout<<"top "<<top<<endl;
if((a[m][i]=='/')&&(a[m][i+1]=='.')&&(a[m][i+2]=='.')&&((a[m][i+3]=='/')))//"/../"
{
//cout<<"hi 1"<<endl;
if(top==-1)
{
//cout<<"hello 1"<<endl;
a[m]=a[m].replace(i,3,"");
i=i-1;
continue;
}
//出栈
int pos;
pos=zhan[top];
if(top>-1)
{
top--;
}
//string str="";
a[m]=a[m].replace(pos+1,(i-pos+3),"");
//cout<<a[m]<<endl;
i=pos-1;
}else if((a[m][i]=='/')&&(a[m][i+1]=='.')&&(a[m][i+2]=='.')&&(a[m][i+3]=='\0'))//"/.."
{
//cout<<"hi 2"<<endl;
if(top==-1)
{
//cout<<"hello 2"<<endl;
a[m]="/";
break;
}
//出栈
int pos;
pos=zhan[top];
if(top>-1)
{
top--;
}
//string str="";
a[m]=a[m].replace(pos+1,(i-pos+2),"");
//cout<<a[m]<<endl;
i=pos-1;
}else
{
if(a[m][i]=='/')
{
//入栈
top++;
zhan[top]=i;
}
}
//cout<<a[m]<<endl;
}
}
for(m=0;m<NUM;m++)
{
cout<<a[m]<<endl;
}
/*
cout<<NUM<<endl;
cout<<b<<endl;
for(i=0;i<NUM;i++)
{
cout<<a[i]<<endl;
}*/
return 0;
}
//输入""
//输出/d2/d3

//输入../..
//输出/

//输入../../../
//输出/



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: