HDU-文件系统

发布时间:2024年01月21日

难度参考:强 提高-

Description

Ignatius做了一个文件系统,为了测试他的文件系统是否能正常工作,他打算对他的文件系统做一些测试.

刚开始的时候文件系统里只有一个根目录.Ignatius将输入一系列合法的文件操作命令,请你给出文件系统应该给出的相应提示信息.

Ignatius的文件系统的文件操作命令包括:

1. CD [directory name] : 进入当前目录下名为[directory name]的子目录,如果成功,系统应提示"success",否则提示"no such directory".
2. MD [directory name] : 在当前目录下建立名为[directory name]的子目录,如果当前目录下已经存在名为[directory name]的子目录,则提示"directory already exist",否则提示"success".
3. RD [directory name] : 删除当前目录下名为[directory name]的子目录,如果当前目录下不存在名为[directory name]的子目录,或者名为[directory name]的子目录下还有文件或子目录,则提示"can not delete the directory",否则提示"success".
4. CREATE [file name] : 在当前目录下创建名为[file name]的文件,如果当前目录下已经存在名为[file name]的文件,则提示"file already exist",否则提示"success".
5. DELETE [file name] : 删除当前目录下名为[file name]的文件,如果当前目录下不存在名为[file name]的文件,则提示"no such file",否则提示"success".

以下是几个特殊说明:

1. 要从当前目录退回到上一级目录可以使用"CD …“命令来实现,我们约定根目录的上一级目录是其本身,任何一个目录下都不允许创建名为”…“的子目录,如果有命令试图创建名为”…“的子目录,则系统应反馈"directory already exist”.
2. 要从当前目录直接退回到根目录可以使用"CD “命令来实现,任何一个目录下都不允许创建名为”"的子目录.
3. 为了方便编程,给出的任意一个[directory name]和[file name]都只包括大写字母(A-Z),并且长度都小于20.
4. 在同一个目录下允许存在同名的file和directory,但不允许出现同名的file或directory,在不同目录下则无此限制.
5. 刚开始的时候根目录下没有文件和子目录,当前目录就是根目录本身.
6. 如果一个操作是成功的,则应在当前文件系统的基础上执行相应的操作,以改变文件系统的状态.

Input

输入数据只有一组,该组测试数据包含若干行,每行代表一条文件操作命令,我保证每一条命令都是符合命令格式的.
处理到文件结束.

Output

对于每一条命令,请你给出系统的反馈信息,每个反馈信息占一行.

Sample Input 1?

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 1?

no such directory
success
success
success
success
success
success
can not delete the directory
success
success
success
success
success

AC:

#include<iostream>
#include<cstdio>
#include<set>
#include<map>
#include<string>
using namespace std;
struct folder{
    string name;
    map<string, folder*> folders;
    folder * parent;
    set<string> files;
    folder(){
       parent = NULL;
    }folder(string & fn, folder * pnt){
        name = fn;
         parent = pnt;
    }
};
folder * init(){
    return new folder;
}folder * newfolder(folder * curfolder, string & fname){
    if(fname == ".." || fname == "\\")return NULL;
    map<string, folder*>::iterator it = curfolder->folders.find(fname);
    if(it!=curfolder->folders.end())return NULL;
    folder * tmpfld = new folder(fname, curfolder);
    curfolder->folders.insert(pair<string, folder *>(fname, tmpfld));
    return tmpfld;
}folder * delfolder(folder * curfolder, string & fname){
     map<string, folder*>::iterator it = curfolder->folders.find(fname);
     if (it == curfolder->folders.end())
       return NULL;     
    folder * fld = it->second;
    if (!fld->files.empty() || !fld->folders.empty())
        return NULL;
    delete it->second;
    curfolder->folders.erase(it);
   return curfolder;
}folder * gotodir(folder * root, folder * cur, string &fname){
    if (fname == "\\")return root;
    if (fname == ".."){
         if (root == cur)return root;
         else return cur->parent;
     }map<string, folder*>::iterator it = cur->folders.find(fname);
     if (it == cur->folders.end())return NULL;
    else return it->second;
 }
 int newfile(folder * curfolder, string & fname)
 {
     set<string>::iterator it = curfolder->files.find(fname);
    if (it != curfolder->files.end())
         return -1;
     curfolder->files.insert(fname);
     return 0;
 }
 int delfile(folder * curfolder, string & fname)
 {
     set<string>::iterator it = curfolder->files.find(fname);
     if (it == curfolder->files.end())
         return -1;
     curfolder->files.erase(it);
     return 0;
 }
 int main()
 {
     folder * root = init();
     folder * current = root;
     string op;
     while (cin >> op)
     {
         string fname;
         cin >> fname;
         if (op == "CD")
        {
            folder * tmpresult = gotodir(root, current, fname);
            if (tmpresult == NULL)
                 cout << "no such directory" << endl;
             else
             {
                 cout << "success" << endl;
                 current = tmpresult;
             }
         }
         else if (op == "MD")
         {
             if (newfolder(current, fname) == NULL)
                 cout << "directory already exist" << endl;
             else
                 cout << "success" << endl;
         }
         else if (op == "RD")
         {
             if (delfolder(current, fname) == NULL)
                 cout << "can not delete the directory" << endl;
             else
                 cout << "success" << endl;
         }
         else if (op == "CREATE")
         {
             if (newfile(current, fname) == -1)
                cout << "file already exist" << endl;
            else
                 cout << "success" << endl;
         }
         else if (op == "DELETE")
         {
             if (delfile(current, fname) == -1)
                cout << "no such file" << endl;
             else
                 cout << "success" << endl;
       }
    }
     return 0;
}

文章来源:https://blog.csdn.net/Lemon_C17y/article/details/135727344
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。