心得:
一道比较基础的数据结构题,没什么算法可言,关键是要熟练各种数据结构的各种操作,其次还要有耐心。
传送门
Problem Description
Ignatius做了一个文件系统,为了测试他的文件系统是否能正常工作,他打算对他的文件系统做一些测试.
刚开始的时候文件系统里只有一个根目录.Ignatius将输入一系列合法的文件操作命令,请你给出文件系统应该给出的相应提示信息.
Ignatius的文件系统的文件操作命令包括:
- CD [directory name] : 进入当前目录下名为[directory name]的子目录,如果成功,系统应提示"success",否则提示"no such directory".
- MD [directory name] : 在当前目录下建立名为[directory name]的子目录,如果当前目录下已经存在名为[directory name]的子目录,则提示"directory already exist",否则提示"success".
- RD [directory name] : 删除当前目录下名为[directory name]的子目录,如果当前目录下不存在名为[directory name]的子目录,或者名为[directory name]的子目录下还有文件或子目录,则提示"can not delete the directory",否则提示"success".
- CREATE [file name] : 在当前目录下创建名为[file name]的文件,如果当前目录下已经存在名为[file name]的文件,则提示"file already exist",否则提示"success".
- DELETE [file name] : 删除当前目录下名为[file name]的文件,如果当前目录下不存在名为[file name]的文件,则提示"no such file",否则提示"success".
以下是几个特殊说明:
- 要从当前目录退回到上一级目录可以使用"CD …“命令来实现,我们约定根目录的上一级目录是其本身,任何一个目录下都不允许创建名为”…“的子目录,如果有命令试图创建名为”…“的子目录,则系统应反馈"directory already exist”.
- 要从当前目录直接退回到根目录可以使用"CD “命令来实现,任何一个目录下都不允许创建名为”"的子目录.
- 为了方便编程,给出的任意一个[directory name]和[file name]都只包括大写字母(A-Z),并且长度都小于20.
- 在同一个目录下允许存在同名的file和directory,但不允许出现同名的file或directory,在不同目录下则无此限制.
- 刚开始的时候根目录下没有文件和子目录,当前目录就是根目录本身.
- 如果一个操作是成功的,则应在当前文件系统的基础上执行相应的操作,以改变文件系统的状态.
Input
输入数据只有一组,该组测试数据包含若干行,每行代表一条文件操作命令,我保证每一条命令都是符合命令格式的.
处理到文件结束.
Output
对于每一条命令,请你给出系统的反馈信息,每个反馈信息占一行.
Sample Input
CD ACM
MD ACM
CD ACM
CREATE ACM
MD ACM
CD ACM
CD
RD ACM
CD ACM
RD ACM
DELETE ACM
CD …
RD ACM
Sample Output
no such directory
success
success
success
success
success
success
can not delete the directory
success
success
success
success
success
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
struct directory //一个文件系统的主要组成部分:目录和文件
{
char directory_Name[99]; //目录名
char file_Name[99][99]; //文件名,因为一个目录下可包含多个文件,故用二维数组
int directory_Num; //目录名的数量
int file_Num; //文件名的数量
directory *pre; //前驱
directory *next[99]; //后继
}*dir;
char output[6][99] //对应输出的各种情况
{
"success"
,"no such directory"
,"directory already exist"
,"can not delete the directory"
,"file already exist"
,"no such file"
};
int main()
{
dir=new directory;
directory *root=dir; //根节点
strcpy(dir->directory_Name,"\\"); //初始化
dir->directory_Num=dir->file_Num=0; //初始化
dir->pre=dir; //初始化
int flag,tag; //用于标记
char cmd[9],str[29]; //cmd:对文件操作的命令 str:目录名或文件名
while(~scanf("%s%s",cmd,str))
{
if(!strcmp(cmd,"CD"))
{
flag=1; //先假设找不到
if(dir->directory_Num) //目录不为空
{
for(int i=0;i<dir->directory_Num; i++) //遍历寻找与输入同名的目录名(不知道有没有更高效的办法~)
if(!strcmp(dir->next[i]->directory_Name,str))
{
flag=0;
dir=dir->next[i]; //实现进入目录的操作
break;
}
}
if(!strcmp(str,"..")) //实现返回上一级目录的功能
{
dir=dir->pre;
flag=0;
}
if(!strcmp(str,"\\")) //第一个'\'是转义字符
{
dir=root; //返回到根目录
flag=0;
}
printf("%s\n",output[flag]);
}
else if(!strcmp(cmd,"MD"))
{
flag=0;
if(dir->directory_Num)
{
for(int i=0; i<dir->directory_Num; i++)
if(!strcmp(dir->next[i]->directory_Name,str))
{
flag=2; //与之前的目录重名则创建失败
break;
}
}
if(strcmp(str,"..")==0||strcmp(str,"\\")==0)
flag=2; //不允许创建..或\\目录
printf("%s\n",output[flag]);
if(!flag) //数据结构中“增”的操作
{
directory *another=new directory;
strcpy(another->directory_Name,str);
another->file_Num=another->directory_Num=0;
another->pre=dir;
dir->next[dir->directory_Num]=another;
(dir->directory_Num)++;
}
}
else if(!strcmp(cmd,"RD"))
{
flag=0;
if(dir->directory_Num)
{
for(int i=0; i<dir->directory_Num; i++)
{
if(!strcmp(dir->next[i]->directory_Name,str)) //找到了要删除的目录
{
if(dir->next[i]->directory_Num||dir->next[i]->file_Num)
{
flag=3; //目录下还有文件或目录则不能删除
break;
}
else
{
tag=i;
break;
}
}
if(i==dir->directory_Num)
flag=3;
}
}
else
flag=3;
printf("%s\n",output[flag]);
if(!flag) //“删”操作
{
for(; tag<dir->directory_Num; tag++)
{
dir->next[tag]=dir->next[tag+1];
}
(dir->directory_Num)--;
}
}
else if(!strcmp(cmd,"CREATE")) //文件的“增”
{
flag=0;
if(dir->file_Num)
{
for(int i=0; i<dir->file_Num; i++)
if(!strcmp(dir->file_Name[i],str))
{
flag=4;
break;
}
}
printf("%s\n",output[flag]);
if(!flag)
{
strcpy(dir->file_Name[dir->file_Num],str);
(dir->file_Num)++;
}
}
else //文件的“删”
{
flag=5;
if(dir->file_Num)
{
for(int i=0; i<dir->file_Num; i++)
{
if(!(strcmp(dir->file_Name[i],str)))
{
flag=0;
tag=i;
break;
}
}
}
printf("%s\n",output[flag]);
if(!flag)
{
for(; tag<dir->file_Num; tag++)
strcpy(dir->file_Name[tag],dir->file_Name[tag+1]);
(dir->file_Num)--;
}
}
}
return 0;
}