71. Simplify Path

Given an absolute path for a file (Unix-style), simplify it.

For example,
path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"

click to show corner cases.

Corner Cases:
  • Did you consider the case where path = "/../"?
    In this case, you should return "/".
  • Another corner case is the path might contain multiple slashes '/' together, such as "/home//foo/".
    In this case, you should ignore redundant slashes and return "/home/foo".

==================

简化路径,

注意:1,能够自动优化路径例如,/../可以变为/

  2,能够将  多了斜杠///   简化为一个/

=================

思路:

这里需要一个字符串划分函数,c++中是没有提供字符串划分函数的.

可以参考[ http://www.cnblogs.com/li-daphne/p/5524752.html ]分析过程.

   主要是利用了string类中的find,substr函数

----

对输入字符串做slipt之后,所有的路径名字包括[.]和[..]都会存入一个vector中,

此后,我们再利用栈来剔除[.]和[..]路径,

最后一次对栈中的数据进行处理就好了.

============

代码如下:

void myslipt(string &s,vector<string> &re,string &c){
        std::string::size_type pos1,pos2;
        pos2 = s.find(c);///find
        pos1 = 0;
        while(std::string::npos != pos2){
            string t = s.substr(pos1,pos2-pos1);///[p1,p2)
            if(!t.empty()){
                re.push_back(t);
            }
            pos1 = pos2+c.size();
            pos2 = s.find(c,pos1);
        }
        if(pos1!=s.length()){
            re.push_back(s.substr(pos1));
        }
    }

    string simplifyPath(string path) {
        vector<string> re;
        string c = "/";
        myslipt(path,re,c);
        stack<string> st;
        for(size_t i = 0;i<re.size();i++){
            if(re[i]==".") continue;
            else if(re[i]==".."){
                if(st.empty()){
                    continue;
                }else{
                    st.pop();
                }///if-else
            }else{
                st.push(re[i]);
            }
        }
        string result;
        while(!st.empty()){
            result.insert(0,st.top());
            result.insert(0,"/");
            st.pop();
        }
        return result;
    }
原文地址:https://www.cnblogs.com/li-daphne/p/5608400.html