结构与算法 7-30 目录树 (40行精简)

7-30 目录树 (30 分)

在ZIP归档文件中,保留着所有压缩文件和目录的相对路径和名称。当使用WinZIP等GUI软件打开ZIP归档文件时,可以从这些信息中重建目录的树状结构。请编写程序实现目录的树状结构的重建工作。

输入格式:

输入首先给出正整数N(≤10​4​​),表示ZIP归档文件中的文件和目录的数量。随后N行,每行有如下格式的文件或目录的相对路径和名称(每行不超过260个字符):

  • 路径和名称中的字符仅包括英文字母(区分大小写);
  • 符号“\”仅作为路径分隔符出现;
  • 目录以符号“\”结束;
  • 不存在重复的输入项目;
  • 整个输入大小不超过2MB。

输出格式:

假设所有的路径都相对于root目录。从root目录开始,在输出时每个目录首先输出自己的名字,然后以字典序输出所有子目录,然后以字典序输出所有文件。注意,在输出时,应根据目录的相对关系使用空格进行缩进,每级目录或文件比上一级多缩进2个空格。

输入样例:

7
b
c\
ab\cd
a\bc
ab\d
a\d\a
a\d\z\

输出样例:

root
  a
    d
      z
      a
    bc
  ab
    cd
    d
  c
  b

 

#include<iostream>
#include<map>
#include<string>
using namespace std;
struct tree {
	map<string, tree> mp;
};
map<string, tree> trees = { {"#root",tree()} };		
void show(const map<string, tree>& trees,const int& space) {
	for (auto& it : trees) {
		cout << string(space, ' ');
		if (it.first[0] == '#') {
			cout << it.first.substr(1) << endl;
			if (!it.second.mp.empty())
				show(it.second.mp, space + 2);
		}
		else
			cout << it.first << endl;
	}
}
int main() {
	int n;
	string str;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> str;
		string tmp;
		map<string, tree>* m = &trees["#root"].mp;		//以#开始标识为目录
		for (int j = 0; j < str.size(); j++) {
			if (str[j] == '\\') {
				m->insert({ '#'+tmp,tree() });
				m = &(*m)['#'+tmp].mp;					//嵌套
				tmp = "";
				continue;
			}
			tmp += str[j];		
		}
		if(!tmp.empty())
			m->insert({ tmp,tree() });
	}
	show(trees,0);
	return 0;
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值