首页 > 其他 > 详细

4-08. 目录树【pat】

时间:2014-04-03 05:39:47      阅读:832      评论:0      收藏:0      [点我收藏+]

4-08. 目录树

时间限制
400 ms
内存限制
32000 kB
代码长度限制
8000 B
判题程序
Standard

在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;
}


 

4-08. 目录树【pat】,布布扣,bubuko.com

4-08. 目录树【pat】

原文:http://blog.csdn.net/linsheng9731/article/details/22824025

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!