题目详情
给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 ‘/’ 开头),请你将其转化为更加简洁的规范路径。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/simplify-path
解题思路
通过读题,可以很直观的得出该题可以通过 栈 结 构 \color{red}{栈结构} 栈结构 解题。根据题意我们可以得出,入栈就表示进入一个新的目录,出栈表示返回到上一层目录,栈顶元素表示当前所以的目录。而且,通过不同的符号可以得出响应的出入栈规则,其规则如下:
- 每次读取到目录名称则将名称入栈
- 遇到
.
则不进行任何操作- 遇到 ‘…’ ,则将栈顶元素弹出。
通过以上分析,那么我们就只剩下最后一个问题了,那就是如何从给定的字符串中提取出目录名或者是操作符。根据题意可知,任意两个
/
之间的内容必定是操作符或者是目录名称了,所以可以通过截取两个/
之间的内容来获取操作符或者目录名称。
C++ 代码
string simplifyPath(string path) {
stack<string> s;
int len = path.length();
// 由于输入中有些不是以'/'结尾,为了统一,将所有的字符串都已'/'结尾
if (path.at(len - 1) != '/') {
path += '/';
len += 1;
}
// 保存操作符或者操作数
string temp = "";
for (int i = 0; i < len; i++) {
char c = path.at(i);
if (c != '/') { // 如果不是分隔符
temp += c;
continue;
}
// 是操作符之后的操作
if (temp == "") { // 当输入的是多个相邻的'/'时,此时temp为空串,不需要处理
continue;
}
if (temp == "..") { // 返回上一层
if (!s.empty()) {
s.pop();
}
temp = "";
continue;
}
if (temp != ".") { // 当不是 .. 和 .时,说明必定是目录名称了
s.push(temp);
}
temp = "";
} // end of for
if (s.empty()) {
return "/";
}
string res = "";
while (!s.empty()) {
res = "/" + s.top() + res;
s.pop();
}
return res;
}