文件路径简化-堆栈

Simplify Path No.71

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

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

如果仅仅从不断replace输入路径的角度出发,会非常复杂。

如果用一个栈来一次存储各级路径的directory名字,然后重组,会简便一些,这也是文件路径简化类题目的常用思路。

为了末尾可以顺序遍历栈重组path,我们不用传统的stack lib,而用vector来实现栈,这样可以方便顺序遍历。

class Solution {
public:
    string simplifyPath(string path) {
        if(path.length() == 0) return "";
        vector<string> v;
        int p = 0, start = 0;
        while(p < path.length()){
            if(path[p] == '/') ++p;
            else{
                start = p;
                while(p < path.length() && path[p] != '/') ++p;
                string temp = path.substr(start, p-start);
                if(temp == ".."){ 
                    if(!v.empty()) v.pop_back(); //遇到".."就出栈
                    else{
                        if(path[0] != '/') v.push_back(temp); //如果没东西可以出,就要看path是否以根目录开头了,不是以根目录开头的话,".."要进栈的
                    }
                }else if(temp == "."){} //遇到"."就跳过
                else if(temp.length() > 0){
                    v.push_back(temp);
                }
            }
        }
        string res = (path[0] == '/' ? "/" : ""); //重组path
        for(vector<string>::iterator i = v.begin(); i < v.end(); ++i){
            res.append(*i);
            if(i < v.end()-1) res.append("/");
        }
        return res;
    }
};






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值