问题:
输入输出:
样例输入:
1
22
MKDIR dira
CD dirb
CD dira
MKDIR a
MKDIR b
MKDIR c
CD …
MKDIR dirb
CD dirb
MKDIR x
CD …
MKDIR dirc
CD dirc
MKDIR y
CD …
SZ
LS
TREE
RM dira
TREE
UNDO
TREE
样例输出:
OK
ERR
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
9
dira
dirb
dirc
root
dira
a
b
c
dirb
x
dirc
y
OK
root
dirb
x
dirc
y
OK
root
dira
a
b
c
dirb
x
dirc
y
题解:
我们对于这个实验,我们首先要进行的是对于命令的封装,考虑到一条命令不单有命令形式,还有命令参数,比如“MKDIR s”,等 会我们肯定还要进行参数的分离,同类信息最好内聚,因此我们使用一个struct结构体来进行封装,对于每一个命令都有一个索引来代表他。
之后我们对于整个实验的框架 就确定为树。因为目录就是一个树形结构。
之后我们就对于具体操作进行实现。我们对于每一个操作要确定操作的对象。之后我们按照要求实现对于每一个操作的要求。对于MKDIR、RM、CD三种操作,我们还需要记录下来,因为这三种操作会进行undo操作。
关于tree,我们直接暴力实现会超复杂度,所以我们就对于操作节点进行缓存,这样我们就可以对整个操作进行加速。
完整代码:
#include<iostream>
#include<stdio.h>
#include<string>
#include<vector>
#include<map>
#include<string.h>
using namespace std;
char tempstring[20];
struct directory;
struct command
{
const string names[7] = {
"MKDIR","RM","CD","SZ","LS","TREE","UNDO" };
int type;
string argument;
directory* target;
command(string& s)
{
for (int i=0;i<7;i++)
{
if(s==names[i])
{
type=i;
}
}
if (type<3)
{
scanf("%s",tempstring);
argument = tempstring;
}
}
};
struct directory
{
string name;
map<string, directory*> children;
directory* parent;
int dsize;
vector<string>* dtree;
bool update;
directory(string _name,directory* _parent)
{
name=_name;
parent=_parent;
dsize=1;
update=true;
dtree=new vector<string>;
}
directory* makedir(string &s);
directory* cd(string &s);
directory* getchild(string& s);
directory* rm(string &s);
void maintain(int s);
void ls();
void sz()
{
printf("%d\n", dsize);
};
void tree();
directory* addchild(directory* s);
void treeall(vector<string>* s);
void treefirstfive(int n, vector<string>* s);
void treelastfive(int n, vector<string>* s);
};
directory* directory::getchild(string& s)
{
map<string