简化路径(栈实现)
题目:给定一个文档 (Unix-style) 的完全路径,请进行路径简化.例如,
path ="/home/"
, =>"/home"
path ="/a/./b/../../c/"
, =>"/c"
边界情况:
- 你是否考虑了 路径 =
"/../"
的情况?
在这种情况下,你需返回"/"
。 - 此外,路径中也可能包含多个斜杠
'/'
,如"/home//foo/"
。
在这种情况下,你可忽略多余的斜杠,返回"/home/foo"
。 -
char* simplifyPath(char* path) { char *stack[1024]; /*定义一个字符型指针数组stack*/ int i = 0, bottom = -1, start = 0; /*bottom作为栈顶指针*/ int len = strlen(path); while (i < len) { if (path[i] != '/') { /*当存在某一段为/../或者/..将栈内的字符串减少一个*/ if (path[i] == '.'&&path[i + 1] == '.' && (path[i + 2] == '/' || path[i + 2] == '\0')) { if (bottom >= 0) bottom--; i = i + 2; /*i指针往后移动两位*/ } else if (path[i] == '.' && (path[i + 1] == '\0' || path[i + 1] == '/')) { i++; /*i指针往后移动一位*/ } else { int start = i; /*i作为计数器统计出该段中有多少个字符*/ while (path[i] != '\0'&&path[i] != '/') { i++; } /*完成该段字符的进栈*/ char *temp = (char*)malloc(sizeof(char)*(i - start + 1)); /*字符串的末尾保存了一个*/ memset(temp, 0, sizeof(char)*(i - start + 1)); /*将temp所指向的内存都设置为0*/ memcpy(temp, &path[start], sizeof(char)*(i - start)); /*将path数组中的i-start个元素拷贝进temp中*/ bottom++; stack[bottom] = temp; //printf("%s", temp, start); } } else i++; } /*输出字符*/ char *ret = (char*)malloc(sizeof(char)*(len + 1)); /*定义一个栈ret*/ memset(ret, 0, sizeof(char) * (len + 1)); int index = 0; i = 0; ret[0] = '/'; /*当输入仅有‘/’时,输出‘/’*/ //int len_char = 0; while (i <= bottom) { ret[index] = '/'; /*为每一段字符添加一个‘/’*/ index++; int len_char = strlen(stack[i]); memcpy(&ret[index], stack[i], len_char); free(stack[i]); index += len_char; i++; } return ret; }
算法:根据题目意思,所谓的简化路径就是输出必须是“/字母字符/字母字符”或者“/字母字符/....”,若为“.../字母字符”或者“/字母字符/.../字母字符”都是不符合题目意思的。因此,可以考虑使用栈的数据结构来实现,将相邻两个反斜杠之间的内容看成是一个等待检查的字符串,若该字符串只含有字母字符,那么让其进栈,若该字符串只含有点字符,且其不是最后一个待检查的字符串,则不让该字符串进栈,如果栈中有字符串,还要让其出栈。该题的算法就是这样,具体的实现可以看代码,已经写了非常详细的注释。
- 欢迎大家留言提问,或者QQ咨询:1390644540
posted on 2018-11-06 11:06 Beyond_YYL 阅读(252) 评论(0) 编辑 收藏 举报