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;
}
标签:斜杠,2023CUGB,路径,样例,ss,天梯,根目录,校赛,目录
From: https://www.cnblogs.com/Qiansui/p/17341776.html