【CCF 201604-3】路径解析

版权声明: https://blog.csdn.net/leelitian3/article/details/82463213

大致思路

①预处理当前目录

将当前目录的路径都保存在一个vector<string> vec_cur中:将"/"替换为" ",然后用字符串流即可

②预处理给定目录

1.将"//"全部删除,将"/./"替换为"/"

2.若给定目录为绝对路径:类似于①中方法将路径保存至vector<string> path中,其中遇到".."时将vector的最后一个元素删除即可;

若给定目录为相对路径,令path = vec_cur,再将其当做绝对路径处理。

C++满分代码

#include <iostream>
#include <vector>
#include <cstring>
#include <sstream>
using namespace std;

int p;
string cur,input,tmp;
vector<string> path;
vector<string> vec_cur;

void deal_cur()
{
	tmp = cur;
	for(size_t i=0; i<cur.size(); ++i)
		if(tmp[i] == '/') tmp[i] = ' ';
	stringstream ss(tmp);
	while(ss>>tmp)
		vec_cur.push_back(tmp);
}

void deal_input()
{
	path.clear();
	size_t p;
	while((p=input.find("//")) != string::npos)
		input.erase(p,2);

	while((p=input.find("/./")) != string::npos)
		input.replace(p,3,"/");

	if(input[0] != '/') path = vec_cur;

	for(size_t i=0; i<input.size(); ++i)
		if(input[i] == '/') input[i] = ' ';
	stringstream ss(input);
	while(ss>>tmp)
	{
		//cout<<"tmp:"<<tmp<<"\n";
		if(tmp == "..")
		{
			if(!path.empty()) path.pop_back();
		}
		else path.push_back(tmp);
	}
}

void print()
{
	if(!path.empty())
	{
		for(int i=0; i<path.size(); ++i)
			cout<<"/"<<path[i];
	}
	else cout<<"/";
	cout<<"\n";
}

int main()
{
	cin>>p;
	cin.get();
	getline(cin,cur);
	deal_cur();
	while(p--)
	{
		getline(cin,input);
		deal_input();
		print();
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/leelitian3/article/details/82463213