文件结构图

 



 说明:用目录深度用来递推,在遇到目录输出深度。每一层用优先级队列记录文件,并在遇到目录结束符时打印输出该层的文件,并返回上一层,遇到组结束符时打印输出根目录文件;源码如下:

#include<iostream>

#include<vector>

#include<string>

#include<queue>

using namespace std;

class cmp                                              //函数对象,用于创建优先级队列时做比较器

{

public:

    bool operator()(const string& a, const string& b)    //比较器

    {

        return a > b;

    }

};

 

void print(int deep, string s)                          //用于打印输出目录层级,deep记录深度

{

    for (int i = 0; i < deep; i++)

        cout << "|     ";

    cout << s << endl;

}

//递归函数

void dir(int deep, queue<string>& qs)               

{

    //优先级队列,记录该层的文件

    priority_queue<string, vector<string>, cmp> pqs;

    if (deep == 0)      //根目录

    {

        cout << "ROOT" << endl;

        if (qs.front().at(0) == 'f')   //判断是否为文件,如果是将其压入当层队列中

        {

            pqs.push(qs.front());

        }

        if (qs.front().at(0) == 'd')   //判断是否为目录,如果是就进入下一层

        {

            dir(deep + 1, qs);

        }

        if (qs.front().at(0) == ']' || qs.front().at(0) == '*')   // 判断是否到了,目录结尾或测试数据末尾

        {

            while (pqs.empty() == 0)                              //输出该层的文件

            {

                print(deep, pqs.top());

                pqs.pop();

            }

            return;                                              //返回上一层

        }

        qs.pop();                                               //将目录结束符弹出;

    }

    else

    {

        print(deep, qs.front());                                 //当进入非根目录时,输出目录深度及名称

        qs.pop();                                               //弹出目录名

    }

    while (!qs.empty())                                         //处理非根目录

    {

        if (qs.front().at(0) == 'f')

        {

            pqs.push(qs.front());

            qs.pop();                                           // 将当层文件压入后,从队列中弹出该文件

        }

        if (qs.front().at(0) == 'd')

        {

            dir(deep + 1, qs);

        }

        if (qs.front().at(0) == ']' || qs.front().at(0) == '*')

        {

            while (pqs.empty() == 0)

            {

                print(deep, pqs.top());

                pqs.pop();

            }

            if (qs.front().at(0) == '*') cout << endl;

            qs.pop();                                          // 记得压结束符

            return;

        }

    }

   

}

 

int main(void)

{

    int times = 0;

    string s;

    queue<string> qs;

    cin >> s;

    while (s != "#")

    {

        if (s == "*")  //将整组数据压入队列中

        {

            times++;

            cout << "DATA SET"<< times << ':' <<  endl;

            qs.push(s); //记得压入结束符

            dir(0, qs);

        }

        else

            qs.push(s); //将处理的数据压入队列中

        cin >> s;

    }

    return 0;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值