简化 Unix 风格的路径,需要考虑的包括 "/../", "//", "/./" 等情况
输入描述: Unix 风格的路径
输出描述: 简化后的Unix 风格路径
示例1
输入 /a/./b/../../c/
输出 /c
知识点:Unix路径信息,栈
“/.” 表示本级目录,可以忽略
“/..” 表示返回上一级目录,即若上一级目录存在,连同“/..”一并删除,否则只删除“/..”
若去除冗余后路径为空,返回“/”
若包含多个连续“/”, 删除多余的“/”
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
string str;
cin>>str;
int len=str.length();
stack<string> Stack;
int i=0;
string tmp;
while(i<len)
{
while(i<len&&str[i]=='/')
i++;
tmp.clear();
while(i<len&&str[i]!='/')
{
tmp+=str[i];
i++;
}
if(tmp=="..")
{
if(!Stack.empty())
Stack.pop();
}
else if(tmp==".")
continue;
else if(!tmp.empty())
{
Stack.push(tmp);
}
}
if(Stack.empty())
{
cout<<"/";
return 0;
}
string rs="";
while(!Stack.empty())
{
rs="/"+Stack.top()+rs;//注意是从右往左构造路径字符串
Stack.pop();
}
cout<<rs;
return 0;
}