PTA 目录树 (30 分)

该程序旨在根据ZIP归档文件中的信息重建目录树结构。输入包含N(≤10,000)个文件和目录的相对路径,程序需按层次和字典序输出。每个目录在输出时会根据其深度进行缩进,先输出目录,再按字典序输出子目录和文件。示例展示了如何处理和输出不同路径。" 112882438,10539576,Vue.js el-table 自适应表头和固定列宽度解决方案,"['前端开发', 'Vue', 'CSS', 'HTML', 'JavaScript']

7-14 目录树 (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
可以用map去模拟,为了速度还可以unordered_map,就是保存一个指针数组作为文件夹,然后保存一个文件

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int deep;
    map<string,node*>file;
    map<string,node*>ct;
    node()
    {
        deep=0;
    };
}*root;
void la(int n)
{
    n++;
    while(n--)cout<<"  ";
}
void dfs(node *cNode)
{
    if(cNode==NULL)	return;
    map<string,node*>::iterator it1,it2;
    for(it1=cNode->ct.begin(); it1!=cNode->ct.end(); it1++)
    {
        la(cNode->deep);
        cout<<it1->first<<endl;
        dfs(it1->second);
    }
    for(it2=cNode->file.begin(); it2!=cNode->file.end(); it2++)
    {
        la(cNode->deep);
        cout<<it2->first<<endl;
    }
    delete cNode;
}
int main()
{
    int n;
    cin>>n;
    root=new node();
    while(n--)
    {
        string s;
        cin>>s;
        node *cNode=root;
        string t;
        for(int i=0; s[i]; i++)
        {
            if(s[i]=='\\')
            {
                if(cNode->ct[t]==NULL)
                {
                    node *tNode=new node();
                    tNode->deep=cNode->deep+1;
                    cNode->ct[t]=tNode;
                    cNode=tNode;
                }
                else
                {
                    cNode=cNode->ct[t];
                }
                t="";
            }
            else t+=s[i];
        }
        if(t!="")
        {
            if(cNode->file[t]==NULL)
            {
                node *tNode=new node();
                tNode->deep=cNode->deep+1;
                cNode->file[t]=tNode;
                cNode=tNode;
            }
            else
                cNode=cNode->file[t];

        }
    }
    cout<<"root"<<endl;
    dfs(root);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值