博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
复杂程设题之A - 咕咕东的目录管理器(C++
阅读量:3950 次
发布时间:2019-05-24

本文共 3427 字,大约阅读时间需要 11 分钟。

目录

problem

我认为看这个英文版的很舒服(当然看中文也很爽:

在这里插入图片描述

题目

在这里插入图片描述

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

test data

样例输入:

122MKDIR diraCD dirbCD diraMKDIR aMKDIR bMKDIR cCD ..MKDIR dirbCD dirbMKDIR xCD ..MKDIR dircCD dircMKDIR yCD ..SZLSTREERM diraTREEUNDOTREE

样例输出

OKERROKOKOKOKOKOKOKOKOKOKOKOKOK9diradirbdircrootdiraabcdirbxdircyOKrootdirbxdircyOKrootdiraabcdirbxdircy

简单解释

解释:其实TA已经在课堂上解释了一遍,还敲了一遍代码(写了一遍代码

所以,,,,,,,,,,

首先看到这道复杂的题,要有一个代码框架,不要直接把它看成一个大问题,事实就是你很难直接解决一个大问题,但是你解决一个小问题会非常容易。所以有句话叫做:“大事化小,小事化了。”

我们要对一个目录进行操作,建立,删除,查询,撤销操作等等,所以建立一个字符串数组,存操作的名称,建立一个结构体,或者声明一个类,将操作包含进去,然后分别实现每一个函数。莫非这就是对函数进行封装。
我理解的封装就是class{public: private};

Codes

#include
#include
#include
#include
using namespace std;string str;struct Dr{
string name;//目录名 map
kids;//子目录 Dr *par;//父目录 int tsize;//目录个数 bool update;//是否更新 vector
desc;//存储遍历的后代 Dr(string nam,Dr *pa){ this->name=nam; this->par=pa; this->tsize=1; }public: Dr* getkid(string st){ auto it=kids.find(st); if(it==kids.end()) return NULL; else return it->second; } void maintain(int x){ update=true; tsize+=x; if(par!=NULL) par->maintain(x); } bool addkid(Dr* sr){ if(kids.find(sr->name) != kids.end()) return false; kids[sr->name]=sr; maintain(+sr->tsize); return true; } Dr* mkdir(string st){ if(kids.find(st)!=kids.end()) return NULL; Dr* d=new Dr(st,this); kids[st]=d; maintain(1); return d; } Dr* rm(string st){ auto it=kids.find(st); if(it==kids.end()) return NULL; maintain(-1*it->second->tsize); Dr *tmp=it->second; kids.erase(it); return tmp; } Dr* cd(string st){ if(st=="..")//判断是否返回上一步 return par; return getkid(st); } void sz(){ cout<
<
first<
first<
first<
update){ desc.clear(); treeall(&desc); this->update=false; } for(auto it=desc.begin();it!=desc.end();it++) cout<<*it<
update){ desc.clear(); treefirst(5,&desc); treelast(5,&desc); this->update=false; } for(int i=0;i<5;i++) cout<
<
=5;i--) cout<
<
* vec){ vec->push_back(name); for(auto it=kids.begin();it!=kids.end();it++) it->second->treeall(vec); } void treefirst(int nums,vector
* vec){ vec->push_back(name); if(--nums==0) return; int n=kids.size(); auto it=kids.begin(); while(n--){ int len=it->second->tsize; if (len >= nums) { it->second->treefirst(nums,vec); return; } else { it->second->treefirst(len,vec); nums-= len; } it++; } } void treelast(int nums,vector
* vec){ int n=kids.size(); auto it=kids.end(); while(n--) { it--; int len=it->second->tsize; if(len>=nums){ it->second->treelast(nums,vec); return; } else{ it->second->treelast(len,vec); nums-=len; } } vec->push_back(name); }}; struct cmd{ string cmds[7]={ "MKDIR","RM","CD","SZ","LS","TREE","UNDO"}; int type; Dr* dir; string arg; cmd(string s){ for(int i=0;i<7;i++){ if(cmds[i]==s){ type=i; if(i<3){ cin>>str; arg=str; } return; } } }};void solve(){ int tag; cin>>tag; Dr* now=new Dr("root",NULL); vector
cmdls; for(int i=0;i
>str; Dr* d; cmd *ch=new cmd(str); switch(ch->type){ case 0: ch->dir=now->mkdir(ch->arg); if(ch->dir==NULL) cout<<"ERR"<
dir=now->rm(ch->arg); if(ch->dir==NULL) cout<<"ERR"<
cd(ch->arg); if(d==NULL) cout<<"ERR"<
dir=now; now=d; cmdls.push_back(ch); } break; case 3: now->sz();break; case 4: now->ls();break; case 5: now->tree();break; case 6: { bool su=false; while(!su&&!cmdls.empty()){ ch=cmdls.back(); cmdls.pop_back(); if(ch->type==0) su = now->rm(ch->arg)!=NULL; else if(ch->type==1) su=now->addkid(ch->dir); else if(ch->type==2){ now=ch->dir; su=true; } } if(su) cout<<"OK"<
>m; while(m--) solve(); return 0;}

转载地址:http://idwzi.baihongyu.com/

你可能感兴趣的文章
乐观锁与悲观锁
查看>>
单例设计模式
查看>>
装饰设计模式和代理设计模式的区别
查看>>
Struts2中值栈
查看>>
Hash算法冲突解决方法分析
查看>>
网络地址和主机地址
查看>>
IP地址和子网掩码
查看>>
linux常用指令介绍
查看>>
scala学习之安装问题
查看>>
LDAP常见错误码
查看>>
linux yum安装rpm包出现问题
查看>>
idea编译报错类似xxx.java:[85,65] 错误: 找不到符号
查看>>
ArrayList复制
查看>>
idea打开项目时,文件左下角显示橙色J
查看>>
SQL注入
查看>>
linux中ldconfig的使用介绍
查看>>
ldap适合入门学习
查看>>
ldap学习参考博客
查看>>
linux学习之source命令与alias(别名)使用
查看>>
MYSQL常用查询
查看>>