给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 ‘/’ 开头),请你将其转化为更加简洁的规范路径。
在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (…) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,’//’)都被视为单个斜杠 ‘/’ 。 对于此问题,任何其他格式的点(例如,’…’)均被视为文件/目录名称。
请注意,返回的 规范路径 必须遵循下述格式:
始终以斜杠 ‘/’ 开头。
两个目录名之间必须只有一个斜杠 ‘/’ 。
最后一个目录名(如果存在)不能 以 ‘/’ 结尾。
此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 ‘.’ 或 ‘…’)。
返回简化后得到的 规范路径 。
/*
22.1.7
简化路径
1.先用/分割字符串这是必要的
2.利用栈来解决简化的问题
3.注意点不分割是行不通滴
*/
#include
#include
#include
using namespace std;
string simplifyPath(string path);
int main()
{
cout<<simplifyPath("/…/./GVzvE/./xBjU///…/…///././//T/…/…/…/./zu/q/e");
return 0;
}
string simplifyPath(string path)
{
stacka;
int count=path.size();
string t="";
if(path[0]!=’/’)
path=’/’+path;
for(int i=0;i<count;i++)
for(int j=i+1;j<count;j++)
{
if(path[i]’/’&&(path[j]’/’||jcount-1))
{
if(j-i>1||path[j]!=’/’)
{
string s="";
if(jcount-1&&path[j]!=’/’)
s=path.substr(i,j-i+1);
else
s=path.substr(i,j-i);
if(!a.empty())
{
if(s=="/…")
a.pop();
if(s!="/."&&s!="/…")
a.push(s);
}
else
{
if(s!="/."&&s!="/…")
a.push(s);
}
}
i=j;
}
}
if(a.size()==0)
a.push("/");
stackb;
while(!a.empty())
{
b.push(a.top());
a.pop();
}
while(!b.empty())
{
t=t+b.top();
b.pop();
}
return t;
}