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