文件系统_HDU1413

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)

Problem 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
2
3
4
5
6
7
8
9
10
11
12
13
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
2
3
4
5
6
7
8
9
10
11
12
13
no such directory
success
success
success
success
success
success
can not delete the directory
success
success
success
success
success
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <cstdlib>
#include <map>
#include <set>
#include <vector>


using namespace std;

struct Block {
int type; // 1 file , 0 directory
char name[256];
Block *root;
Block *father;
vector<Block *> son;

Block(Block *fa, char name[], int type) {
// 创建普通目录及文件
strcpy(this->name, name);
root = fa->root;
father = fa;
this->type = type;
}

Block() {
// 创建root目录
strcpy(name, "\\");
type = 0;
root = this;
father = this;

}

Block *find(char name[], int type) {

if (strcmp(name, "\\") == 0) return root;
if (strcmp(name, "..") == 0) return father;
for (Block *bl:son) {
if (strcmp(bl->name, name) == 0 && bl->type == type) return bl;
}
return NULL;
}

int md(char name[]) {
if (find(name, 0) != NULL) {
cout << "directory already exist" << endl;
return 1;
} else {
Block *tmp = new Block(this, name, 0);
son.push_back(tmp);
cout << "success" << endl;
return 0;
}
}

int rd(char name[]) {
Block *p = find(name, 0);
if (p == NULL || p == father || p == root || p->son.size() > 0) {
cout << "can not delete the directory" << endl;
return 1;
} else {
for (vector<Block *>::iterator it = son.begin(); it != son.end(); it++) {
if (*it == p) {
son.erase(it);
delete p;
break;
}
}
cout << "success" << endl;
}
}

int ls() {
for (Block *bl:son) {
cout << bl->type << " " << bl->name << endl;
}
}

int cre(char name[]) {
if (find(name, 1) != NULL) {
cout << "file already exist" << endl;
return 1;
} else {
Block *tmp = new Block(this, name, 1);
son.push_back(tmp);
cout << "success" << endl;
return 0;
}
}

int del(char name[]) {
Block *p = find(name, 1);
if (p == NULL) {
cout << "no such file" << endl;
return 1;
} else {
for (vector<Block *>::iterator it = son.begin(); it != son.end(); it++) {
if (*it == p) {
son.erase(it);
delete p;
break;
}
}
cout << "success" << endl;
}
}

int pwd() {
if (this == root) {
cout << "\\";
return 0;
} else {
father->pwd();
cout << name << "\\";
}
return 0;
}
};
int cd(Block*&cur,char to[])
{
Block* p=cur->find(to,0);
if (p==NULL)
{
cout<<"no such directory"<<endl;
return 1;
}else {
cur=p;
cout<<"success"<<endl;
return 0;
}
}

int main() {
Block * root = new Block;
Block * dir=root;
char a[100],b[100];
while (cin>>a)
{
if (strcmp(a,"CD")==0) {
cin>>b;
cd(dir,b);
}
else if (strcmp(a,"MD")==0){
cin>>b;
dir->md(b);
}
else if (strcmp(a,"LS")==0) {
dir->ls();
} else if (strcmp(a,"RD")==0)
{
cin>>b;
dir->rd(b);
} else if (strcmp(a,"CREATE")==0)
{
cin>>b;
dir->cre(b);
}else if (strcmp(a,"DELETE")==0)
{
cin>>b;
dir->del(b);
} else if (strcmp(a,"PWD")==0){
dir->pwd();
cout<<endl;
}
}
return 0;
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!