没有用stack来写,直接用了字符串和指针,过程有点复杂的。首先对读入的每一个路径,判断它是绝对路径或者相对路径,然后确定起始的路径,然后继续一位位的判断,"//","/../","/./"等多种情况,还需要考虑末尾有无"/"和是否为空行等等。
当我把一切都写好了的时候,提交之后发现只有90分,苦思无果,然后仔细阅读来一下题目,发现题目没有排除文件名字为"..***"和".***"的情况,做了相应修改后再次提交终于满分了!泪牛满面~~
#include<cstdio> #include<cstring> #include<iostream> using namespace std; int main() { char root[1005],each[2005]; int n; scanf("%d",&n); getchar(); gets(root); while(n--) { char ans[2005] = {0}; gets(each); char *p1,*p2; if(each[0] != '/') { strcpy(ans,root); p1 = ans; while(*p1 != 0) p1++; *p1 = '/'; p2 = each; } else { p1 = ans; *p1 = '/'; p2 = each; } while(*p2 != 0) { if(*p1 == '/' && *p2 == '.' && *(p2+1) =='.' && (*(p2+2) == '/' || *(p2+2) == 0)) { if(p1 == ans) {} else while(*--p1 != '/'); p2 += 2; } else if(*p1 == '/' && *p2 == '/') p2++; else if(*p1 == '/' && *p2 == '.' && (*(p2+1) == '/' || *(p2+1) == 0)) p2++; else *++p1 = *p2++; } if(*p1 == '/' && p1 != ans) *p1 = 0; else *(p1+1) = 0; puts(ans); } return 0; }