week9 目录管理系统

本文介绍了使用C++实现一个目录管理系统的题目解析和解决方案。通过结构体封装命令,利用树形结构表示目录,并针对MKDIR、RM、CD操作进行记录以支持撤销功能。在实现TREE命令时,采用操作节点缓存提升效率。
摘要由CSDN通过智能技术生成

问题:

在这里插入图片描述
在这里插入图片描述

输入输出:

在这里插入图片描述样例输入:
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值