Solution
就是一个很麻烦的模拟。
不过,模拟的过程,真的让人心情愉悦。
虽然还有一个点W了。不知道为什么。
但是这就是编程的乐趣。让无序的东西编程有序,让所有的操作变得可行,模拟一个简单的电脑中的菜单~。
注意一点的是:可以用map来完成映射。但是需要每一个目录都用一个map来映射属于该节点的儿子。
否则就不能访问在两个文件中名字的相同的子文件中的地址。
所以不如之间O(N )扫描来查找。
大致的过程都在代码里了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<vector>
using namespace std;
int cnt,Q,now_data;
string a,b;
struct Document{ //文件夹
vector <int> son; //保存当前文件夹里面的子目录地址。
int father; //保存当前文件夹父目录的地址。
string name; //当前文件夹的名字。
bool flag; //flag =1 表示为 文件 0表示为文件夹 2表示被删除
}document[1001];
void Init_system()
{
cin>>Q;
now_data=0;document[0].father=-1;
for (int i=0;i<=1000;i++)
document[i].flag=-1;
}
int find_name(int &now_data,string name,int flag) //flag=1 查找文件 否则查找文件夹
{
if(flag==1)
{
for (int i=0;i<document[now_data].son.size();i++)
{
int new_data=document[now_data].son[i];
if((document[new_data].name==name)&&(document[new_data].flag==1))
return new_data;
}
return -1;
}
if(flag==0)
{
for (int i=0;i<document[now_data].son.size();i++)
{
int new_data=document[now_data].son[i];
if((document[new_data].name==name)&&(document[new_data].flag==0))
return new_data;
}
return -1;
}
}
void Build_Document(int &now_data,string name)//创建文件夹
{
int iter=find_name(now_data,name,0);
if(iter!=-1)
cout<<"Directory already exists!"<<endl;
else
{
document[now_data].son.push_back(++cnt);
document[cnt].father=now_data;
document[cnt].name=name;
document[cnt].flag=0;
}
}
void Build_File(int &now_data,string name)//创建文件
{
int iter = find_name(now_data,name,1);
if(iter!=-1)
cout<<"File already exists!"<<endl;
else
{
document[now_data].son.push_back(++cnt);
document[cnt].father=now_data;
document[cnt].name=name;
document[cnt].flag=1;
}
}
void Enter_SD(int &now_data,string name) //进入子目录
{
int iter = find_name(now_data,name,0); //注意子目录的必须是一个文件夹才可以进入
if(iter!=-1)
now_data=iter;
else
cout<<"No such directory!"<<endl;
}
void Enter_FD(int &now_data) //进入父目录
{
if(document[now_data].father!=-1)
now_data=document[now_data].father;
else
cout<<"No parent directory!"<<endl;
}
void Delete_File(int &now_data,string name)//删除文件
{
int iter = find_name(now_data,name,1);
if(iter!=-1)
document[iter].flag=2; //2表示该地址的文件已经删除
else
cout<<"No such file!"<<endl;
}
void Delete_Document(int &now_data ,string name)//删除文件夹
{
int iter = find_name(now_data,name,0);
if(iter!=-1)
document[iter].flag=2; //2表示该地址的文件已经删除
else
cout<<"No such directory!"<<endl;
}
void Print(int &now_data) //输出当前子目录的所有文件
{
for (int i=0;i<document[now_data].son.size();i++)
{
int v=document[now_data].son[i];
string name=document[v].name;
int iter=document[v].flag;
if(iter != 2){ //判断是否删除
if( iter == 0) cout<<name<<" <D>"<<endl;
if( iter == 1) cout<<name<<" <F>"<<endl;
}
}
cout<<endl;
}
int main()
{
freopen("nacumegu.in","r",stdin);
//freopen("nacumegu.out","w",stdout);
Init_system();
while(Q--)
{
cin>>a; if(a!="ls") cin>>b;
if(a=="cd"&&b!="..") Enter_SD(now_data,b);
else if(a=="cd"&&b=="..") Enter_FD(now_data);
else if(a=="touch") Build_File(now_data,b);
else if(a=="rm") Delete_File(now_data,b);
else if(a=="mkdir") Build_Document(now_data,b);
else if(a=="rmdir") Delete_Document(now_data,b);
else if(a=="ls") Print(now_data);
}
return 0;
}