在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