Simplify Path

Description:

Given an absolute path for a file (Unix-style), simplify it.
For example,
path = “/home/”, => “/home”
path = “/a/./b/../../c/”, => “/c”

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. 重复连续出现的’/’,只按1个处理,即跳过重复连续出现的’/’;
  2. 如果路径名是”.”,则不处理;
  3. 如果路径名是”..”,则需要弹栈,如果栈为空,则不做处理;
  4. 如果路径名为其他字符串,入栈;
  5. 最后,再逐个取出栈中元素(即已保存的路径名),用’/’分隔并连接起来。

代码:

#include <iostream>
#include <stack>
#include <string>

using namespace std;

string SimplifyPath(string path)
{   
    string result = "";  //save simplify path
    stack<string> sk;   //save pathname
    for (size_t i = 0; i < path.size();)
    {
        while ( i < path.size() && path[i] == '/')  //skip continuous '/'
            i++;
        string str = "";    //save name
        while ( i < path.size() && path[i] != '/')
        {
            str += path[i];
            i++;
        }
        if (str == ".." && !sk.empty())
        {
            sk.pop();
            i++;
        }
        else if (str != "" && str != "." &&str != "..")
        {
            sk.push(str);
        }


    }

    if (sk.empty())     //stack is empty
        return "/";

    while (!sk.empty())
    {
        result += "/" + sk.top() ;
        sk.pop();
    }

    return result;
}

int main()
{
    string path = "/home/";
    string path2 = "/a/./b/../../c/";
    string path3 = "/../";
    string path4 = "/home//foo/";

    cout << SimplifyPath(path) << endl;
    cout << SimplifyPath(path2) << endl;
    cout << SimplifyPath(path3) << endl;
    cout << SimplifyPath(path4) << endl;

    system("pause");

    return 0;
}

测试:

这里写图片描述


参考:

http://blog.csdn.net/makuiyu/article/details/44497901

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值