CCF-201604-3-路径解析

题目

在这里插入图片描述

思路

70分:没有注意到输入空字符串;
80分:相对路径和绝对路径的区别不是第一个字符是否为’.’,而是是否为’/’

这里代码有点冗长,需要精简一下。
还可以使用stringstream来解题,非常方便。代码如下:

代码

//使用sstream
#include<iostream>
#include<sstream>
#include<stack>

using namespace std;
stack<string> sta,stmp;
int main()
{
	int n;
	cin>>n;
	string p,s,now;
	cin>>now;
	getchar();//吸收换行符 
	while(n--)
	{
		getline(cin,p);//对于string,getline可以获取含有空格的字符串,遇到换行自动结束
		if(p.size()==0) s=now; 
		else
		{
			
			if(p[0]!='/')//相对路径
			//if(p[0]=='.')
				s=now+'/'+p;
			else//绝对路径
				s=p; 
		}
		for(int i=0;i<s.size();i++)
			if(s[i]=='/')s[i]=' ';
			
		//stringstream开始了
		stringstream sstream(s);//将s放进string流中 
		string tmp;
		while(sstream>>tmp)//将字符串读入到tmp中 
		{
			if(tmp==".")continue;
			if(tmp=="..")
			{
				if(!sta.empty())sta.pop();
				continue;
			}
			sta.push(tmp);
		} 
		//输出,用vector更好一点
		if(sta.empty())
		{
			cout<<'/'<<endl;
			continue;
		}
		while(!sta.empty())
		{
			stmp.push(sta.top());
			sta.pop();
		}
		while(!stmp.empty())
		{
			cout<<'/'<<stmp.top();
			stmp.pop();
		}
		cout<<endl;
		
	}
	return 0;
}
//麻烦一点的
#include<iostream>
#include<stack>
#include<stdio.h>
#include<string>
#include<string.h>

using namespace std;
stack<string> st;
stack<string> stt;

void cpyst()
{
	while(!stt.empty())
		stt.pop();
	stack<string> tmp;
	while(!st.empty())
	{
		tmp.push(st.top());
		st.pop();
	}
	while(!tmp.empty())
	{
		stt.push(tmp.top());
		st.push(tmp.top());
		tmp.pop();
	}
	
}

void outp(stack<string> s1)
{
	if(s1.empty())cout<<'/';
	else
	{
		stack<string> sta;
		while(!s1.empty())
		{
			sta.push(s1.top());
			s1.pop();
		}
		while(!sta.empty())
		{
			cout<<'/';
			cout<<sta.top();
			sta.pop();
		}
	} 
	cout<<endl;
}

int main()
{
	int n;
	cin>>n;
	string now;
	cin>>now;
	int sze=now.size();
	//得到当前目录 
	
	for(int i=0;i<sze;)
	{
		if(now[i]=='/')
		{
			i++;
			continue;
		}
		if(now[i]=='.'&&now[i+1]=='.'&&i+1==sze-1||i+3<=sze&&now[i]=='.'&&now[i+1]=='.'&&now[i+2]=='/')
		{
			if(!st.empty())st.pop();
			i+=2;
			continue;
		}
		if(now[i]=='.'&&i==sze-1||i+2<=sze&&now[i]=='.'&&now[i+1]=='/')
		{
			i++;
			continue;
		}
		string str;int j;
		//是文件名字,因为文件名中可能含有'.',所以这个if不能和上面的if调换位置 
		for(j=i;j<sze&&now[j]!='/';j++)
		{
			str+=now[j];
		}
		st.push(str);
		i=j;
	}
	
	
	getchar();
	
	//正规化 
	string p;
	while(n--)
	{
		getline(cin,p);
		if(p.size()==0)
		{
			outp(st);
			continue;
		}
		sze=p.size();
		if(p[0]!='/')//需要用到当前目录 
		{
			cpyst()
			
			for(int i=0;i<sze;)//注意这里的i+1 
			{
				
				if(p[i]=='/')
				{
					i++;
					continue;
				}
				if(p[i]=='.'&&p[i+1]=='.'&&i==sze-2||i+3<=sze&&p[i]=='.'&&p[i+1]=='.'&&p[i+2]=='/')
				{
					if(!stt.empty())stt.pop();
					i+=2;//循环中也会i++ 
					continue;
				}
				if(p[i]=='.'&&i==sze-1||i+2<=sze&&p[i]=='.'&&p[i+1]=='/')
				{
					i++;
					continue;
				}
				string str;int j;
				//是文件名字,因为文件名中可能含有'.',所以这个if不能和上面的if调换位置 
				for(j=i;j<sze&&p[j]!='/';j++)
				{
					str+=p[j];
				}
				stt.push(str);
				i=j;
			}
			outp(stt);
		}
		else//不需要用到本机目录 
		{
			stack<string> t;
			for(int i=0;i<sze;)
			{
				if(p[i]=='/')
				{
					i++;
					continue;
				}
				if(p[i]=='.'&&p[i+1]=='.'&&i+1==sze-1||i+3<=sze&&p[i]=='.'&&p[i+1]=='.'&&p[i+2]=='/')
				{
					if(!t.empty())t.pop();
					i+=2;
					continue;
				}
				if(p[i]=='.'&&i==sze-1||i+2<=sze&&p[i]=='.'&&p[i+1]=='/')
				{
					i++;
					continue;
				}
				string str;int j;
				//是文件名字,因为文件名中可能含有'.',所以这个if不能和上面的if调换位置 
				for(j=i;j<sze&&p[j]!='/';j++)
				{
					str+=p[j];
				}
				t.push(str);
				i=j;
			}
			//输出
			outp(t);
		}
		
		
	}
	return 0;
 } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值