题目描述
现在很多操作系统的文件系统都是基于树形结构设计的。即一个目录下可以有若干个目录和文件,而每个目录和文件都可以通过一条从根目录出发的唯一路径来唯一确定。我们希望你实现对这样的一个文件系统的简单管理。
为了简化问题,我们做出如下假设:
假设文件系统初始时只有一个根目录root。
假设所有出现的文件和目录的名字都是唯一的。即,不会有两个相同名字的文件出现,不会有两个相同名字的目录出现,也不会有一个文件和一个目录名字相同。
文件名字和目录名字都是长度在1到20之间的字符串(包括1和20),且只由英文大写字母、英文小写字母、数字组成。大小写字母之间不等效。
你需要实现如下操作:
CREATEFILE FILENAME DIRNAME
这个操作的含义是:在DIRNAME的目录下创建一个名字为FILENAME的文件。我们保证当出现这个操作时,DIRNAME是一个已经存在的目录,而FILENAME这个名字是首次出现。
CREATEDIR DIRNAME1 DIRNAME2 这个操作的含义是:在DIRNAME2的目录下创建一个名字为DIRNAME1的目录。我们保证当出现这个操作时,DIRNAME2是一个已经存在的目录,而DIRNAME1这个名字是首次出现。
LISTFILE DIRNAME 这个操作的含义是:按照创建的先后顺序打印出DIRNAME目录下的所有文件名字。我们保证当出现这个操作时,DIRNAME是一个已经存在的目录.
LISTDIR DIRNAME 这个操作的含义是:按照创建的先后顺序打印出DIRNAME目录下的所有目录名字。我们保证当出现这个操作时,DIRNAME是一个已经存在的目录
输入格式
第一行有一个整数T,表示一共有T(T≤20)组数据需要你处理。请注意各组数据之间是相互独立的。每当处理新的一组数据时,你都应当假设此时只有一个名字为root的根目录存在。
对于每组数据,第一行有一个整数N(0< N≤100),表示有N个操作需要你处理,接下来的N行,每一个行描述了一个操作。
输出格式
对于每个LISTFILE操作和LISTDIR操作,如果找到了X个文件(或目录),你需要输出X行,按照创建时间从早到晚的顺序,每一行打印一个文件(或目录)的名字。如果找到了0个文件(或目录),就不要输出任何东西。请注意不要输出多余的空格和换行符。
输入样例
2
8
CREATEFILE desktop root
CREATEDIR DESKTOP root
LISTFILE root
LISTDIR DESKTOP
CREATEFILE scr20130412 DESKTOP
CREATEFILE scr20130411 DESKTOP
CREATEFILE scr20130413 DESKTOP
LISTFILE DESKTOP
5
LISTFILE root
CREATEDIR webapp root
CREATEDIR myweb webapp
CREATEDIR MyWeb webapp
LISTDIR webapp
输出样例
desktop
scr20130412
scr20130411
scr20130413
myweb
MyWeb
/*
本以为应该是输出包括子文件夹的内容,其实并没有……,原本想用层次遍历遍历所有
子文件夹的内容,根本不需要,只要输出本文件夹的就好,根本不需要层次遍历,我是直接从
原本的代码直接改的,根本不需要层次遍历,各位看官请注意
*/
#include <bits/stdc++.h>
using namespace std;
const int maxn = 110;
string cf = "CREATEFILE";
string cd = "CREATEDIR";
string ld = "LISTDIR";
string lf = "LISTFILE";
string fileType= "file";
string dirType = "dir";
struct node
{
int num;
string name;
string type;
vector<int>son;
};
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
node s[maxn];
int cnt = 1;
s[0].name = "root";
s[0].type = "dir";
s[0].num = 0;
cin>>n;
string op, son1,fa;
for(int i = 0; i < n; i++)
{
cin>>op;
if(op == cf)
{
cin>>son1>>fa;
for(int j = 0; j < cnt; j++)
{
if(s[j].name == fa)
{
s[j].son.push_back(cnt);
}
}
s[cnt].name = son1;
s[cnt].num = cnt;
s[cnt++].type = "file";
}
else if(op == cd)
{
cin>>son1>>fa;
for(int j = 0; j < cnt; j++)
{
if(s[j].name == fa)
{
s[j].son.push_back(cnt);
}
}
s[cnt].name = son1;
s[cnt].num = cnt;
s[cnt++].type = "dir";
}
else if(op == ld)
{
cin>>fa;
queue<int>q;
for(int j = 0; j < cnt; j++)
{
if(s[j].name == fa)
{
q.push(j);break;
}
}
int flag = 1;
while(!q.empty())
{
int now = q.front();
q.pop();
if(!flag)
cout<<s[now].name<<endl;
flag = 0;
for(int k = 0; k < s[now].son.size(); k++)
{
int sid = s[now].son[k];
if(s[sid].type == dirType)
{
// q.push(sid);
cout<<s[sid].name<<endl;
}
}
}
}
else if(op == lf)
{
cin>>fa;
queue<int>q;
for(int j = 0; j < cnt; j++)
{
if(s[j].name == fa)
{
q.push(j);break;
}
}
while(!q.empty())
{
int now = q.front();
q.pop();
// cout<<s[now].name<<endl;
for(int k = 0; k < s[now].son.size(); k++)
{
int sid = s[now].son[k];
// if(s[sid].type == dirType)
// {
// q.push(sid);
// }
if(s[sid].type == fileType)
{
cout<<s[sid].name<<endl;
}
}
}
}
}
}
return 0;
}