CCF 201604-3 路径解析(100分完善版)

题目就不赘述了,上一篇是未完善版,这一版终于改好啦!!!
看了好久才发现之前的局限在哪了,因为读入数据的问题没有处理好,导致空行输入时,不能正确读取,进而结果错误。

分析一下我的个人思路:
我直接使用了vector容器存储路径中的各级(我把路径处理成级别形式),遇到文件或目录就直接存储,“.”则不作处理,“…”退一级(借助vector容器的pop_back(函数))。
在处理路径前判断是绝对路径还是相对路径,绝对路径可以直接处理,相对路径则在容器中赋值当前目录,然后处理即可。
(其实两者处理的实质是一样的,为什么我用了两个函数呢?因为岗开始的思路就是这样,有没有再改,再就是考虑到使用substr()函数的参数时,相对路径从0开始,绝对路径从1开始,其实修改一下两个函数就可以合在一起使用了,我太懒了,就不再改了)

#include<iostream>
#include<vector>
#include<string>
#include<cstdio>
#include<cstring>
using namespace std;
vector<string> par,v;
//处理绝对路径
void Absolute_way(string s){
	for(int len=1;len<s.length();){
		string str;
		int pos=s.find("/",len);
		//t处理特殊情况“///”
		if(pos==len){
			len++;
			continue;
		}
		//获得/.../之间的字符串,进而进行处理
		else if(pos!=string::npos){
			str=s.substr(len,pos-len);	
		}
		else{
		   	str=s.substr(len,s.length()-len);
		   	pos=s.length()-1;			
	    }
			if(str==".."){  //情况"/../"
				if(v.size())
				  v.pop_back();  
			}
			else if(str=="."){ //情况“/./”

			}
			else{
				v.push_back(str);
			}
			len=pos+1;		
    }   
}
//处理相对路径
void Resp_way(string s){
	for(int i=0;i<par.size();i++){
		v.push_back(par[i]);
	}
	for(int len=0;len<s.length();){
		string str;
		int pos=s.find("/",len);
		if(pos==len){
			len++;
			continue;
		}
		else if(pos!=string::npos){
			str=s.substr(len,pos-len);
		}
		else{
			str=s.substr(len,s.length()-len);
			pos=s.length()-1;
		}
			if(str==".."){
				if(v.size())
				  v.pop_back(); 
			}
			else if(str=="."){

			}
			else{
				v.push_back(str);
			}
	    len=pos+1;
		
    }
}
int main(){
	int n;
	cin>>n;
	getchar();//读取回车符
	string s;
	char temp[1010];
	gets(temp);//读取字符数组以回车符为标志
	s=temp;
	//处理当前目录(划分等级)
	for(int len=1;len<s.length();){
		int pos=s.find("/",len);
		if(pos!=string::npos){
			string p=s.substr(len,pos-len);
			par.push_back(p);
			len=pos+1;
		}
		else{
			string p=s.substr(len,s.length()-len);
			par.push_back(p);
			len=s.length();
		}
	}	 	    
	while(n--){
	    
		string str;
		gets(temp);
		if(strlen(temp)==0){//若路径为空字符串,则正规化操作的结果是当前目录。
			for(int i=0;i<par.size();i++)
		       cout<<"/"<<par[i];
	 	    cout<<endl;
		}
		else{
			str=temp;
			if(str[0]=='/')
		       Absolute_way(str);
		    else
		      Resp_way(str); 
		    if(v.size()){
		      	for(int i=0;i<v.size();i++)
		            cout<<"/"<<v[i];
	 	        cout<<endl;
		        v.clear();
			  }
			  else  //若处理完为根目录(即容器为空)则输出“/”
			    cout<<"/"<<endl;
		   
		}
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值