在ZIP归档文件中,保留着所有压缩文件和目录的相对路径和名称。当使用WinZIP等GUI软件打开ZIP归档文件时,可以从这些信息中重建目录的树状结构。请编写程序实现目录的树状结构的重建工作。
输入格式说明:
输入首先给出正整数N(<=104),表示ZIP归档文件中的文件和目录的数量。随后N行,每行有如下格式的文件或目录的相对路径和名称(每行不超过260个字符):
1) 路径和名称中的字符仅包括英文字母(区分大小写);
2) 符号“\”仅作为路径分隔符出现;
3) 目录以符号“\”结束;
4) 不存在重复的输入项目;
5) 整个输入大小不超过2MB。
输出格式说明:
假设所有的路径都相对于root目录。从root目录开始,在输出时每个目录首先输出自己的名字,然后以字典序输出所有子目录,然后以字典序输出所有文件。注意,在输出时,应根据目录的相对关系使用空格进行缩进,每级目录或文件比上一级多缩进2个空格。
样例输入与输出:
| 序号 | 输入 | 输出 |
| 1 |
7 b cab\cd a\bc ab\d a\d\a a\d\z |
root
a
d
z
a
bc
ab
cd
d
c
b
|
| 2 |
1 z |
root z |
这个题目还是看上去好像蛮简单的,但是做起来才发现自己基础太差,很多细节没把握好,导致自己走了很多弯路。首先按就是数据结构的选择,起初没怎么多想就选了list作为每个节点子树的结构,后来发现list用起来各种坑,最不方便的就是不能下标访问。用迭代器各种限制。后来改了dque。
STL里面各种结构的分析在这里:http://blog.163.com/the_yaphets/blog/static/20161613620121178184928/
第二点就是string的用法很不熟悉,把它放到结构体里面初始化时碰到困难。后来还用了结构体的构造函数解决,说类是结构体的进化真是一点都没错!详见:http://blog.csdn.net/qq1987924/article/details/7917156。
第三点么就是要注意一些指针的初始化,老问题了vc一碰到指针操作不当就会挂掉,我看以后还是用2010调程序了。
贴一下核心的代码:
// 4-08.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
#include<string>
#include<string.h>
#include<queue>
using namespace std;
typedef struct node{
string name;
deque<struct node*> next;
node(const char*s){ name=s;}
}node;
typedef struct node* link;
int find_slush(string& temp,string& p)
{
int len=temp.length();
int i=0;
for(i=0;i<len;i++)
{
if(temp[i]==‘\\‘)
{
p=temp.substr(0,i);
temp=temp.substr(i+1,temp.length()-i-1);
if(i!=len-1)
return i;
else
return -1;
}
}
if(i==len)
{
p=temp;
return -1;
}
}
void insert(string& temp,link& root_node)
{
string pp;
int pos=1;
int j=0;
{
pos=find_slush(temp,pp);//赋值给p指针
const char *p=pp.c_str();
link node_temp=new node(p);//申明一个临时节点指针
for(j=0;j<root_node->next.size();j++)
{
if((root_node->next)[j]->name==node_temp->name)
{
if(pos!=-1)
{
insert(temp,(root_node->next)[j]);//传入找到的节点和剩下的关键字
}
break;
}
}
if(j==(root_node->next).size())//没找到数据直接插入本层链表
{
root_node->next.push_back(node_temp);
if(pos!=-1)
{
insert(temp,node_temp);//传入找到的节点和剩下的关键字
}
}
}
}
int main()
{
node node_test("root");
link node_root=&node_test;
string temp;
int n=0;
cin>>n;
while(n--)
{
cin>>temp;//先取第一个数据进来
insert(temp,node_root);
}
return 0;
}
原文:http://blog.csdn.net/linsheng9731/article/details/22824025