题目描述
给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 ‘/’ 开头),请你将其转化为更加简洁的规范路径。
在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (…) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,‘//’)都被视为单个斜杠 ‘/’ 。 对于此问题,任何其他格式的点(例如,‘…’)均被视为文件/目录名称。
请注意,返回的 规范路径 必须遵循下述格式:
始终以斜杠 ‘/’ 开头。
两个目录名之间必须只有一个斜杠 ‘/’ 。
最后一个目录名(如果存在)不能 以 ‘/’ 结尾。
此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 ‘.’ 或 ‘…’)。
返回简化后得到的 规范路径 。
输入样例
输入:path = "/home/"
输出:"/home"
解释:注意,最后一个目录名后面没有斜杠。
输入:path = "/../"
输出:"/"
解释:从根目录向上一级是不可行的,因为根目录是你可以到达的最高级。
输入:path = "/a/./b/../../c/"
输出:"/c"
思路和代码
string simplifyPath(string path)
{
int n=path.size();
stack<string> s;
string re;
int lengths;
int i=0;
int j;
while(i<n)
{
if(path[i]=='/')
{
while(i<n&&path[i]=='/')//处理//的情况
i++;
if(i==n)break;//若是字符串末尾,可以直接退出
j=i;
while(j<n&&path[j]!='/')//切割出斜杆和斜杆之间的字符串
j++;
char ch[2000];
lengths=path.copy(ch,j-i,i);//将path当中的文件名复制到ch字符数组中
ch[lengths]='\0';//加尾巴
//cout<<ch<<endl;
if(strcmp(ch,"..")==0)//如果是”..",则向上返回一个目录,即弹出栈顶元素
{
// cout<<"ch为.."<<endl;
if(!s.empty())
s.pop();
}
else if(strcmp(ch,".")==0)//如果是”.",就什么都不做
{
i=j;
continue;
}
else//如果是其它文件名,则压入栈中
{
s.push(ch);
}
}
i=j;
}
if(s.empty()){
re="/";
return re;
}
while(!s.empty())
{
re.insert(0,"/"+s.top());
s.pop();
}
if(re[re.size()-1]=='/')
re.erase(re.size()-1,1);
return re;
}