2023CUGB天梯校赛

M1.文件路径

题目描述
给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为更加简洁的规范路径。

在 Unix 风格的文件系统中,一个点('.')表示当前目录本身;此外,两个点 ('..') 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//')都被视为单个斜杠 '/' 。 对于此问题,任何其他格式的点(例如,'...')均被视为文件/目录名称。

请注意,返回的 规范路径 必须遵循下述格式:

始终以斜杠 '/' 开头。
两个目录名之间必须只有一个斜杠 '/' 。
最后一个目录名(如果存在)不能 以 '/' 结尾。
此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 '.' 或 '..')。
返回简化后得到的 规范路径 。

输入格式
一行一个字符串,表示一个Unix风格的绝对路径

输出格式
一行一个字符串,表示简化后的规范路径

输入样例1
/home//usr/
输出样例1
/home/usr
输入样例2
/../
输出样例2
/
输入样例3
/a/b/c/d/./..
输出样例3
/a/b/c
样例解释
对于样例2,根目录没有上一级目录,故访问根目录的父目录请求会被直接忽视,最后输出根目录

利用栈来模拟上述所说的操作即可
#include<bits/stdc++.h>

using namespace std;

void solve(){
    stack<string> a;
    string ss,r;
    cin>>ss;
    ss=ss+'/';
    int l=ss.size();
    for(int i=0;i<l;++i){
        if(ss[i]=='/'){
            if(r==""||r=="."){
                r="";
                continue;
            }
            else if(r==".."){
                if(!a.empty()) a.pop();
                r="";
            }
            else{
                a.push(r);
                r="";
            }
        }else{
            r=r+ss[i];
        }
    }
    string ans="";
    if(a.size()==0) ans="/";
    else if(a.size()==1) ans="/"+a.top();
    else{
        while(!a.empty()){
            ans=a.top()+"/"+ans;
            a.pop();
        }
        ans="/"+ans;
        ans=ans.substr(0,ans.size()-1);
    }
    cout<<ans<<"\n";
    return ;
}

signed main(){
    int _=1;
    while(_--){
        solve();
    }
    return 0;
}
posted on 2023-04-21 20:49  Qiansui  阅读(17)  评论(0编辑  收藏  举报