思路:
本思路借鉴了CSDN博主的想法
首先是采用堆栈的数据结构,来实现目录文件的回溯,通过进栈来深入路径,通过出栈来回溯上一层,然后正则化后的路径通过动态数组来进行反向,达到标准的正则化,主要是细节的处理,其中利用到了Java中的正则化表达式来实现/符号的等效!
import java.util.Scanner;
import java.util.Stack;
import java.util.Vector;
public class Main {
public static void main(String argc[]) {
Stack<String> paths=new Stack<String>();
Vector<String>result=new Vector<String>();
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
String npos=new String();
npos=sc.next();
String pos=new String();
String pre=new String("..");
String delimiter=new String("/");
sc.nextLine();
for(int i=0;i<n;i++) {
String ans=new String();
pos=sc.nextLine();
pos=pos.replace("/{2,3}",delimiter);//然后用正则表达式去掉多余的/
if(pos.length()==0) {
System.out.println(npos);
continue;
}
if(pos.charAt(0)!='/') {
String temp[]=npos.split(delimiter);
for(String s:temp) {
if(s.length()==0) {
continue;
}
paths.push(s);
}
}
String temp_pos[]=pos.split(delimiter);
for(String s:temp_pos) {
if(s.length()==0) {
continue;
}
if(!s.equals(pre)&&!s.equals(".")) {
paths.push(s);
}
else if(s.equals(pre)&&!paths.empty()) {
paths.pop();
}
}
while(!paths.empty()) {
result.insertElementAt(paths.pop(), 0);
}
int len=result.size();
if(len==0) {
ans=delimiter;
}
for(int j=0;j<len;j++) {
ans=ans+delimiter+result.get(j);
}
System.out.println(ans);
result.clear();
}
sc.close();
}
}在这里插入代码片
参考文章:CSP201604-3(路径解析)(Java 100分)](https://blog.csdn.net/qq_24681499/article/details/84677010)