百练 / 2775:文件结构“图”

2775:文件结构“图”
2020年7月1日更新内容:
重新复习C++,所以用C++重写了一遍,指针好久不用是真的头疼,还好AC了。
快多了

// inserting into a vector
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <iomanip>
#include <stack>

using namespace std;

void inlineprifix(int layer) {
	for (int i = 0; i < layer; i++) {
		cout << "|     ";
	}
}
typedef struct FileDirType{
	string dirname;
	vector<string> filelist;
	int layer_level;
	vector<struct FileDirType*> filedirtype;
}MyFileDirType;

void ppprint(MyFileDirType content) {
	inlineprifix(content.layer_level);
	cout << content.dirname << endl;
	for (vector<struct FileDirType*>::iterator it = content.filedirtype.begin(); it != content.filedirtype.end(); it++) {
		ppprint(**it);
	}
	sort(content.filelist.begin(), content.filelist.end());
	for (vector<string>::iterator it = content.filelist.begin(); it != content.filelist.end(); it++) {
		inlineprifix(content.layer_level);
		cout << *it << endl;
	}
}



int main() {
	stack<MyFileDirType*> SYSSTACK;
	int layer_counter = 0;
	MyFileDirType ROOT;
	ROOT.dirname = "ROOT";
	ROOT.layer_level = layer_counter;
	MyFileDirType*  currenroot;
	currenroot = &ROOT;
	string input;
	int total_times = 1;


	while (cin >> input) {
		if (input[0] == 'f') {
			currenroot->filelist.push_back(input);

		}
		if (input[0] == 'd') {
			layer_counter += 1;
			MyFileDirType* newone = new MyFileDirType;
			newone->dirname = input;
			newone->layer_level = layer_counter;
			currenroot->filedirtype.push_back(newone);
			SYSSTACK.push(currenroot);
			currenroot = newone;
		}
		if(input[0] == ']'){
			currenroot = SYSSTACK.top();
			SYSSTACK.pop();
			layer_counter -= 1;
		}
		if (input[0] == '*') {
			cout << "DATA SET " << total_times << ":" << endl;
			ppprint(ROOT);
			total_times += 1;
			layer_counter = 0;
			while (!SYSSTACK.empty()) {
				SYSSTACK.pop();
			}
			ROOT.filelist.clear();
			ROOT.filedirtype.clear();
			currenroot = &ROOT;
			cout << endl;
		}
		if (input[0] == '#') {
			break;
		}
	}


	return 0;
}


2020年6月10日内容:
逻辑想清楚了就能做

我用的几乎全是字符串操作,没有在打印的时候优化,而是什么都用字符串操作了,所以确实慢

附一张一遍过的时候的榜单,看看我多慢

# 百练 / 2775:文件结构“图”
# http://bailian.openjudge.cn/practice/2775
# Author:NitrogenousFish
# github:https://github.com/NITROGENousFish/

arr = []
def formatttt(num):
    return "|     "*num
def printfunc(arr,index):
    print("DATA SET "+str(index+1)+":")
    print("ROOT")
    for item in arr:
        print(item)
    print()
def main():
    global arr
    arr_temp = []
    while True:
        something = input()
        if something == "#":
            break
        elif something == "*":
            arr.append(arr_temp)
            arr_temp = []
        else:
            arr_temp.append(something)

    def deal1(arr,layer): 
        # layer = 0
        filelist = []
        index = 0
        outputlist = []
        while index <len(arr):
            if arr[index][0] == "f":
                filelist.append(formatttt(layer)+arr[index])
                index+=1
            elif arr[index][0] == "d":
                start = index
                pos = index
                youkuohaotimes = 1
                while youkuohaotimes !=0:
                    pos += 1
                    if arr[pos][0] == "d":
                        youkuohaotimes +=1
                    if arr[pos][0] == "]":
                        youkuohaotimes -=1
                                #dir变成下一级                  #后面的里被OA
                outputlist = outputlist+[formatttt(layer+1)+arr[start]]+deal1(arr[start+1:pos],layer+1)
                index = pos+1
            else:
                return
        filelist = sorted(filelist)
        return outputlist+filelist

    for index,arr_thing in enumerate(arr):
        printfunc(deal1(arr_thing,0),index)

if __name__ == "__main__":
    main()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值