简化路径(栈实现)

题目:给定一个文档 (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编辑  收藏  举报

导航