zoukankan      html  css  js  c++  java
  • 洛谷P1738 洛谷的文件夹

    原题目:点我

    模拟即可,字符串处理麻烦点。如果没有找到子文件夹就新建文件夹,如果有就进入该文件夹。

    提示:高能,指针+动态内存,用数组太low(在noip中用数组才是王道!)

    #include <iostream>
    #include <vector>
    #include <string>
    using namespace std;
    int foldercnt=-1;//根目录已经算了一个了,所以要把自己去除掉
    bool isleaf(string s)//判断这个字符串有没有斜杠
    {
        for(string::iterator it=s.begin();it!=s.end();++it)
            if(*it=='/')return false;
        return true;
    }
    string getname(string s)//得到这个字符串的第一个斜杠和第二个斜杠之间的字串
    {
        string ans;
        int cnt=0;
        for(string::iterator it=s.begin();it!=s.end();++it)
        {
            if(*it=='/')cnt++;
            if(cnt==1&&*it!='/')ans.push_back(*it);
            if(cnt==2)break;
        }
        return ans;
    }
    string getmy(string s)//得到这个字符串开始到第一个斜杠之间的字串
    {
        string ans;
        bool have=0;
        for(string::iterator it=s.begin();it!=s.end();++it)
        {
            if(*it=='/')have=1;
            if(!have)ans.push_back(*it);
        }
        return ans;
    }
    string getrest(string s)//得到第一个斜杠之后的字串
    {
        string ans;
        bool have=0;
        for(string::iterator it=s.begin();it!=s.end();++it)
        {
            if(have)ans.push_back(*it);
            if(*it=='/')have=1;
        }
        return ans;
    }
    struct folder//文件夹结构体
    {
        /***constructor***/
        folder(string name)//构造函数
        {
            this->name=name;
            this->son.clear();
            foldercnt++;//文件数量++
        }
        ~folder()//析构函数
        {
            for(vector<folder*>::iterator it=this->son.begin();it!=this->son.end();++it)//析构自己所有的子文件夹
                if(*it!=NULL)
                {
                    delete *it;
                    *it=NULL;
                }
        }
        void make(string x)//制作函数
        {
            if(isleaf(x))return;//如果到这里是叶子了,返回
            if(getmy(x)!=this->name)return;//这句话帮了我大忙
            string nm=getname(x);//得到儿子的名称
            for(vector<folder*>::iterator it=this->son.begin();it!=this->son.end();++it)//找一找有没有
            {
                if((*it)->name==nm)//如果有
                {
                    (*it)->make(getrest(x));//切割字符串,进入子文件夹
                    return;//直接返回
                }
            }
            folder* fp=new folder(nm);//没有的情况,新建文件夹
            this->son.push_back(fp);//把文件夹放到儿子表列
            fp->make(getrest(x));//make文件夹
            return;
        }
        string name;//自己的名称
        vector<folder*>son;//儿子表列
    };
    int main()
    {
        folder *root=new folder("");//根节点名字为空
        int n;//数量
        string tmp;//输入
        cin >> n;//输入
        for(int i=1;i<=n;i++)//循环输入
        {
            cin >> tmp;
            root->make(tmp);//制作文件夹
            cout << foldercnt << endl; //输出总数
        }
        delete root;//删除根文件夹,释放内存(你想想你平时删除文件夹了文件夹里面的东西全没了嘛)
        root=NULL;//野指针
        return 0;
    }
    
  • 相关阅读:
    tomcat启动项目,起不起来
    jQuery ajax 获取信息展示在“下拉列表”中
    JQuery,ajax,jsonp 跨域访问
    httpwebrequest详解
    利用HttpWebRequest和HttpWebResponse获取Cookie并实现模拟登录
    C# 中使用System.Net.Http.HttpClient 模拟登录博客园 (GET/POST)
    JAVA-用HttpClient来模拟浏览器GET,POST
    java 实现模拟浏览器 访问网站
    ora-01017 和oracle database link
    JDeveloper 开发环境配置
  • 原文地址:https://www.cnblogs.com/oier/p/5934685.html
Copyright © 2011-2022 走看看