201604-3 | |
试题名称: | 路径解析 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 在操作系统中,数据通常以文件的形式存储在文件系统中。文件系统一般采用层次化的组织形式,由目录(或者文件夹)和文件构成,形成一棵树的形状。文件有内容,用于存储数据。目录是容器,可包含文件或其他目录。同一个目录下的所有文件和目录的名字各不相同,不同目录下可以有名字相同的文件或目录。 输入格式 第一行包含一个整数 P,表示需要进行正规化操作的路径个数。 输出格式 共 P 行,每行一个字符串,表示经过正规化操作后的路径,顺序与输入对应。 样例输入 7 样例输出 /d2/d4/f1 评测用例规模与约定 1 ≤ P ≤ 10。 |
解法1:
巧妙的运用 istream& getline(istream& ,str , delim) 进行读取 由'/'分隔的内容 然后进行处理。这样多个连续的///自动被过滤掉。
#include<cstdio>
#include<iostream>
#include<vector>
#include<string>
#include<map>
#include<cstring>
#include<set>
#include<cmath>
#include<queue>
#include<algorithm>
#define rep(i,j,k) for(int i=j;i<k;++i)
#define mst(a,b) memset((a),(b),sizeof(a))
#include<cstring>
#include<sstream>
using namespace std;
typedef long long LL;
typedef vector<int,int> pii;
void print_path(vector<string> &stk){
for(int i = 0; i < stk.size(); ++i){
cout << "/" << stk[i];
}
if(stk.empty())
cout << "/";
cout << endl;
}
void formalize(vector<string> &stk, string str){
stringstream ss(str); //以str初始化输入流
string dir;
bool first = true;
while(getline(ss,dir,'/')){ // 从 ss中读取数据 以 '/‘ 为分隔符
if(dir.length() == 0){
if(first) stk = vector<string>();//如果是第一次为空则是绝对路径 重新申请一个stk(清空)
}
else if(dir == ".."){
if(!stk.empty()) stk.pop_back();
}
else if(dir == "."){
}
else{
stk.push_back(dir);
}
first = false;
}
}
int main()
{
//freopen("input.txt","r",stdin);
ios::sync_with_stdio(false);
int p;
string pat,str;
vector<string> stk,curStk;
cin >> p;
cin >> pat;
formalize(stk,pat);
cin.get();
while(p--){
getline(cin,str);
curStk = stk;
formalize(curStk,str);
print_path(curStk);
}
return 0;
}
解法2:
直接按照规则进行模拟
#include<cstdio>
#include<iostream>
#include<vector>
#include<string>
#include<map>
#include<cstring>
#include<set>
#include<cmath>
#include<queue>
#include<algorithm>
#define rep(i,j,k) for(int i=j;i<k;++i)
#define mst(a,b) memset((a),(b),sizeof(a))
#include<cstring>
using namespace std;
typedef long long LL;
typedef vector<int,int> pii;
void rid_repeat(string &cur){
int st;
while((st = cur.find("//")) != string::npos){
cur = cur.erase(st,1);
}
}
void rid_cur(string &cur){
int st;
while((st = cur.find("/./")) != string::npos){
cur.erase(st,2);
}
}
void rid_rel(string &cur){
int st;
while((st = cur.find("/../")) != string::npos){
if(st == 0){
cur = cur.erase(st,3);
}
else{
int p = cur.rfind("/",st-1);
cur = cur.erase(p,st-p+3);
}
}
}
int main()
{
//freopen("input.txt","r",stdin);
int q;
string pat,str;
cin >> q;
cin >> pat;
cin.get();
while(q--){
getline(cin,str);
if(str[0] == '/'){
rid_repeat(str);
rid_cur(str);
rid_rel(str);
}
else{
str = pat + "/" + str;
rid_repeat(str);
rid_cur(str);
rid_rel(str);
}
if(str[str.length()-1] == '/' && str.length() > 1)
cout << str.substr(0,str.length()-1) << endl;
else
cout << str << endl;
}
return 0;
}