poj 1057 FILE MAPPING 递归模拟文件系统

 定义结构体

  struct Dir

  {

    vector< Dir > dir;

    vector< string > file;

  };

  通过递归处理, 和输出 就很方便了。

  要注意,当出现子目录时,递归下去处理,回朔后再将其加入到父目录的vector中,不然没有保存到之后的信息。

解题代码:

View Code
#include<algorithm>
#include<iostream>
#include<vector>
#include<string>
#include<stdio.h>

using namespace std;

struct Dir 
{
    string name;
    vector<Dir> d;
    vector<string> f;
};
void solve( Dir &rt, string s )
{
        if( (s.at(0) == '*') || (s.at(0) == ']') )    return;
        else if( s.at(0) == 'f' )
        {
            rt.f.push_back(s);    
            cin >> s;    
            solve( rt, s );    
        }    
        else{ 
            Dir sub;sub.name = s;
            
            cin >> s;
            solve( sub, s ); 
            
            rt.d.push_back(sub);

            cin >> s;
            solve( rt, s );
        }    
}

void print(int floor)
{
    for(int i = 0; i < floor; i++)    
        cout << "|     " ;
}

void fuck( Dir &rt, int floor )
{
    //首先输出x本身目录名    
    print(floor);
    cout << rt.name << endl;
    //对于处在floor层的当前目录x,首先输出其子目录     
    for(int i = 0; i < rt.d.size(); i++)
    {
        fuck( rt.d[i], floor+1 );    
    }
    //按字典序号输出文件
    sort( rt.f.begin(), rt.f.end() );    
    for(int i = 0; i < rt.f.size(); i++)
    {
        print(floor);
        cout << rt.f[i] << endl;
    }
}

int main()
{
        int T = 1;    
        string s;    
        while( 1 )
        {
            cin >> s;    
            if( s.at(0) == '#' ) break;    
            Dir rt;
            rt.name = "ROOT";
    
            solve( rt, s );
            
            cout << "DATA SET " << T++ << ":" << endl;
            fuck( rt, 0 );    
            cout << endl;    
        }
    return 0;
}
原文地址:https://www.cnblogs.com/yefeng1627/p/2851541.html