zoukankan      html  css  js  c++  java
  • 简化路径(栈实现)

    题目:给定一个文档 (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] == ''))
                    {
                        if (bottom >= 0)
                            bottom--;
                        i = i + 2;            /*i指针往后移动两位*/
                    }
                    else if (path[i] == '.' && (path[i + 1] == '' || path[i + 1] == '/'))
                    {
                        i++;        /*i指针往后移动一位*/
                    }
                    else
                    {
                        int start = i;
                        /*i作为计数器统计出该段中有多少个字符*/
                        while (path[i] != ''&&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
  • 相关阅读:
    loj 1257 (求树上每一个点到树上另一个点的最长距离)
    loj 1032 数位dp
    loj 1030概率dp
    loj1011 状态压缩
    java大数取模
    求阶乘的位数
    loj 1426(dfs + bfs)
    携程greenlet模块使用
    如何让socket编程非阻塞?
    分别用request和socket给百多发送请求
  • 原文地址:https://www.cnblogs.com/yangyalong/p/9914115.html
Copyright © 2011-2022 走看看