HDU-文件系统

难度参考:强 提高-

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
#include
#include
#include
#include
using namespace std;
struct folder{
    string name;
    map folders;
    folder * parent;
    set 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::iterator it = curfolder->folders.find(fname);
    if(it!=curfolder->folders.end())return NULL;
    folder * tmpfld = new folder(fname, curfolder);
    curfolder->folders.insert(pair(fname, tmpfld));
    return tmpfld;
}folder * delfolder(folder * curfolder, string & fname){
     map::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::iterator it = cur->folders.find(fname);
     if (it == cur->folders.end())return NULL;
    else return it->second;
 }
 int newfile(folder * curfolder, string & fname)
 {
     set::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::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;
}

你可能感兴趣的:(C++算法进阶,前端,服务器)