91.文件系统

题目描述 
现在很多操作系统的文件系统都是基于树形结构设计的。即一个目录下可以有若干个目录和文件,而每个目录和文件都可以通过一条从根目录出发的唯一路径来唯一确定。我们希望你实现对这样的一个文件系统的简单管理。 
为了简化问题,我们做出如下假设: 
假设文件系统初始时只有一个根目录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个文件(或目录),就不要输出任何东西。请注意不要输出多余的空格和换行符。

输入样例 


CREATEFILE desktop root 
CREATEDIR DESKTOP root 
LISTFILE root 
LISTDIR DESKTOP 
CREATEFILE scr20130412 DESKTOP 
CREATEFILE scr20130411 DESKTOP 
CREATEFILE scr20130413 DESKTOP 
LISTFILE DESKTOP 

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值