给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为更加简洁的规范路径。
在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//')都被视为单个斜杠 '/' 。 对于此问题,任何其他格式的点(例如,'...')均被视为文件/目录名称。
请注意,返回的 规范路径 必须遵循下述格式:
始终以斜杠 '/' 开头。
两个目录名之间必须只有一个斜杠 '/' 。
最后一个目录名(如果存在)不能 以 '/' 结尾。
此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 '.' 或 '..')。
返回简化后得到的 规范路径 。
来源:力扣(LeetCode)
这道题是一道栈的运用题
栈的定义是先进后出,需要压栈,这里去想的是一种是".."为返回上一级,这个时候需要的是把最后面的文件抛出,这样就返回上一个文件了~~
class Solution {
public String simplifyPath(String path) {
String[] names=path.split("/");//用单斜杠进行分割
Deque<String>stack=new ArrayDeque<String>(); //设置栈
for(String name:names){ //将名字进行遍历
if("..".equals(name)){ //需要判断名字是否为..,这时需要看栈是否为空,如果不为空,则抛出最后的那个文件名称
if(!stack.isEmpty()){//判断不为空
stack.pollLast();//删除最后一个元素
}
}else if(name.length()>0&&!".".equals(name)){//如果添加的name大于零,且不等于"."
stack.offerLast(name);//将元素加入栈
}
}
StringBuffer ans=new StringBuffer();//字符串创建
if(stack.isEmpty()){
ans.append('/');//如果为空,字符串为"/"
}else{
while(!stack.isEmpty()){
ans.append('/');
ans.append(stack.pollFirst());//如果不为空,从栈头开始添加到字符串里
}
}
return ans.toString();//字符串读取
}}