题目
思路
70分:没有注意到输入空字符串;
80分:相对路径和绝对路径的区别不是第一个字符是否为’.’,而是是否为’/’
这里代码有点冗长,需要精简一下。
还可以使用stringstream来解题,非常方便。代码如下:
代码
//使用sstream
#include<iostream>
#include<sstream>
#include<stack>
using namespace std;
stack<string> sta,stmp;
int main()
{
int n;
cin>>n;
string p,s,now;
cin>>now;
getchar();//吸收换行符
while(n--)
{
getline(cin,p);//对于string,getline可以获取含有空格的字符串,遇到换行自动结束
if(p.size()==0) s=now;
else
{
if(p[0]!='/')//相对路径
//if(p[0]=='.')
s=now+'/'+p;
else//绝对路径
s=p;
}
for(int i=0;i<s.size();i++)
if(s[i]=='/')s[i]=' ';
//stringstream开始了
stringstream sstream(s);//将s放进string流中
string tmp;
while(sstream>>tmp)//将字符串读入到tmp中
{
if(tmp==".")continue;
if(tmp=="..")
{
if(!sta.empty())sta.pop();
continue;
}
sta.push(tmp);
}
//输出,用vector更好一点
if(sta.empty())
{
cout<<'/'<<endl;
continue;
}
while(!sta.empty())
{
stmp.push(sta.top());
sta.pop();
}
while(!stmp.empty())
{
cout<<'/'<<stmp.top();
stmp.pop();
}
cout<<endl;
}
return 0;
}
//麻烦一点的
#include<iostream>
#include<stack>
#include<stdio.h>
#include<string>
#include<string.h>
using namespace std;
stack<string> st;
stack<string> stt;
void cpyst()
{
while(!stt.empty())
stt.pop();
stack<string> tmp;
while(!st.empty())
{
tmp.push(st.top());
st.pop();
}
while(!tmp.empty())
{
stt.push(tmp.top());
st.push(tmp.top());
tmp.pop();
}
}
void outp(stack<string> s1)
{
if(s1.empty())cout<<'/';
else
{
stack<string> sta;
while(!s1.empty())
{
sta.push(s1.top());
s1.pop();
}
while(!sta.empty())
{
cout<<'/';
cout<<sta.top();
sta.pop();
}
}
cout<<endl;
}
int main()
{
int n;
cin>>n;
string now;
cin>>now;
int sze=now.size();
//得到当前目录
for(int i=0;i<sze;)
{
if(now[i]=='/')
{
i++;
continue;
}
if(now[i]=='.'&&now[i+1]=='.'&&i+1==sze-1||i+3<=sze&&now[i]=='.'&&now[i+1]=='.'&&now[i+2]=='/')
{
if(!st.empty())st.pop();
i+=2;
continue;
}
if(now[i]=='.'&&i==sze-1||i+2<=sze&&now[i]=='.'&&now[i+1]=='/')
{
i++;
continue;
}
string str;int j;
//是文件名字,因为文件名中可能含有'.',所以这个if不能和上面的if调换位置
for(j=i;j<sze&&now[j]!='/';j++)
{
str+=now[j];
}
st.push(str);
i=j;
}
getchar();
//正规化
string p;
while(n--)
{
getline(cin,p);
if(p.size()==0)
{
outp(st);
continue;
}
sze=p.size();
if(p[0]!='/')//需要用到当前目录
{
cpyst()
for(int i=0;i<sze;)//注意这里的i+1
{
if(p[i]=='/')
{
i++;
continue;
}
if(p[i]=='.'&&p[i+1]=='.'&&i==sze-2||i+3<=sze&&p[i]=='.'&&p[i+1]=='.'&&p[i+2]=='/')
{
if(!stt.empty())stt.pop();
i+=2;//循环中也会i++
continue;
}
if(p[i]=='.'&&i==sze-1||i+2<=sze&&p[i]=='.'&&p[i+1]=='/')
{
i++;
continue;
}
string str;int j;
//是文件名字,因为文件名中可能含有'.',所以这个if不能和上面的if调换位置
for(j=i;j<sze&&p[j]!='/';j++)
{
str+=p[j];
}
stt.push(str);
i=j;
}
outp(stt);
}
else//不需要用到本机目录
{
stack<string> t;
for(int i=0;i<sze;)
{
if(p[i]=='/')
{
i++;
continue;
}
if(p[i]=='.'&&p[i+1]=='.'&&i+1==sze-1||i+3<=sze&&p[i]=='.'&&p[i+1]=='.'&&p[i+2]=='/')
{
if(!t.empty())t.pop();
i+=2;
continue;
}
if(p[i]=='.'&&i==sze-1||i+2<=sze&&p[i]=='.'&&p[i+1]=='/')
{
i++;
continue;
}
string str;int j;
//是文件名字,因为文件名中可能含有'.',所以这个if不能和上面的if调换位置
for(j=i;j<sze&&p[j]!='/';j++)
{
str+=p[j];
}
t.push(str);
i=j;
}
//输出
outp(t);
}
}
return 0;
}