前言
题目描述
以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。 在 Unix
风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (…)
表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs
相对路径 请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 /
结尾。此外,规范路径必须是表示绝对路径的最短字符串。
解题思路
题解:
这道题仍然用栈的思想来解决,和之前的思路一样
我们要考虑几种情况:
(1)当遍历到"/“时:就令其变为空格
(2)当遍历到”.“时:什么操作都没有
(3)当遍历到”…“时:弹出栈顶元素 ,如果当前栈顶为空,就返回”/"
(4)当遍历到字母时: 字母入栈
然后在最后合并res(res是用来记录/和当前栈里面的内容的)和栈中的内容
完整代码
#include<iostream>
#include<string>
#include<stack>
#include<vector>
using namespace std;
//题解:
// 这道题仍然用栈的思想来解决,和之前的思路一样
//我们要考虑几种情况:
//(1)当遍历到"/"时:就令其变为空格
//(2)当遍历到"."时:什么操作都没有
//(3)当遍历到".."时:弹出栈顶元素 ,如果当前栈顶为空,就返回"/"
//(4)当遍历到字母时: 字母入栈
//然后在最后合并res(res是用来记录/和当前栈里面的内容的)和栈中的内容
class Solution{
public:
string simplifyPath(string path){
if(path=="/")
return "/";
for(int i=0,i<path.size();i++){
if(path[i]== '/'){
path[i]='';
}
}
vector<string> stack;
istringstream str(path); //这一步有点去掉空格的感觉,其实就是分割字符
string buf;
while(str>>buf){
if(buf==".." && !stack.empty())//当遍历到".."时,就将当前栈顶元素出栈,在vector中表示为pop_back,并删除
stack.pop_back();
else if(buf!="." && buf!="..")//当遍历到字母的时候就把字符串入栈
stack.push_back(buf);
}
if(stack.empty()){//如果遇到".."时栈为空,那么直接返回一个"/",但是并不保存此"/"
return "/";
}
string res;
for(int i=0;i<stack.size();i++){
res=res+"/"+stack[i];
}
return res;
}
};
int main(){
string str;
getline(cin,str);
string
path=Solution().simplifyPath(str);
cout<<path<<endl;
return 0;
}