第九周作業 咕咕東的目錄管理系統

2021-10-05 13:57:35 字數 4205 閱讀 3567

一、題目

咕咕東的雪梨電腦的作業系統在上個月受到宇宙射線的影響,時不時發生故障,他受不了了,想要寫乙個高效易用零bug的作業系統 —— 這工程量太大了,所以他定了乙個小目標,從實現乙個目錄管理器開始。前些日子,東東的電腦終於因為過度收到宇宙射線的影響而宕機,無法寫**。他的好友tt正忙著在b站看貓片,另一位好友瑞神正忙著打守望先鋒。現在只有你能幫助東東!

初始時,咕咕東的硬碟是空的,命令列的當前目錄為根目錄 root。

目錄管理器可以理解為要維護一棵有根樹結構,每個目錄的兒子必須保持字典序。

現在咕咕東可以在命令列下執行以下**中描述的命令:

二、輸入

輸入檔案包含多組測試資料,第一行輸入乙個整數表示測試資料的組數 t (t <= 20);

每組測試資料的第一行輸入乙個整數表示該組測試資料的命令總數 q (q <= 1e5);

每組測試資料的 2 ~ q+1 行為具體的操作 (mkdir、rm 操作總數不超過 5000);

面對資料範圍你要思考的是他們代表的 「命令」 執行的最大可接受複雜度,只有這樣你才能知道你需要設計的是怎樣複雜度的系統。

三、輸出

每組測試資料的輸出結果間需要輸出一行空行。注意大小寫敏感。

四、樣例輸入輸出

input

1

22mkdir dira

cd dirb

cd dira

mkdir a

mkdir b

mkdir c

cd …

mkdir dirb

cd dirb

mkdir x

cd …

mkdir dirc

cd dirc

mkdir y

cd …

szls

tree

rm dira

tree

undo

tree

output

ok

errok

okok

okok

okok

okok

okok

okok

9dira

dirb

dirc

root

diraab

cdirb

xdircyok

root

dirb

xdircyok

root

diraab

cdirb

xdirc

y

五、解題思路定義目錄結構體,記錄當前目錄的名字、map型別儲存孩子節點、父親節點、size下方所有節點的數目、vector儲存當前節點的十個後代(用於tree操作,後代指下方所有節點)、懶更新控制變數。

(1)mkdir操作:查詢當前目錄的孩子節點中是否存在該目錄,如果不存在則新建孩子節點,並向上維護子樹的大小,size數加一。

(2)rm操作:查詢當前目錄的孩子節點中是否存在該目錄,如果存在則刪除它,並且向上維護子樹的大小,size數減掉刪除目錄的size值。

(3)cd操作:如果輸入是"。。",判斷當前目錄是不是根目錄,如果不是根目錄,則找到其父親節點。如果輸入是其他, 則判斷當前目錄孩子節點中是否該目錄,如果存在,則找到該輸入目錄。

(4)sz操作:返回當前目錄的size值。

(5)ls操作:判斷孩子節點數目小於10,直接遍歷map輸出。如果大於10,則輸出前五個,再輸出後五個。

(6)tree操作:懶更新。每個目錄利用vector儲存其十個後代。在執行tree操作時,判斷size小於等於10時,如果並未懶更新過,則更新該目錄的vector,將所有後代放入vector中,如果已經懶更新過,則直接輸出vector中元素。判斷size大於10時,如果並未懶更新過,則需要分兩次更新vector,第一次更新前五個,第二次更新後五個。第一次更新時,前序遍歷判斷孩子節點數目大於需要填充的節點數,則終止繼續查詢,當填充5個後,即退出更新。第二次更新時,從最後乙個點開始逆序遍歷,判斷孩子數大於需要填充的節點數,則終止查詢,並從該子樹中取需要相應數目的資料填充至vector中,按照這種查詢方式,應該是最後乙個節點先填充進vector中,輸出時應逆序;如果已經懶更新過,則只需要輸出。

(7)undo操作:定義command結構體,存放指令型別,指令的名字,以及指令操作的目錄。利用command型別的vector存放當前執行成功的mkdir、rm、cd指令,如果為空,則撤銷失敗。當需要撤銷mkdir指令,則呼叫rm刪除新增的目錄;如果需要撤銷rm指令,則再新增刪除的目錄;如果需要撤銷cd指令,則將當前目錄設定為cd前的目錄,這個資訊存放在command結構體中。

六、**樣例

#include

using

namespace std;

char tmps[20]

;struct directory

void

maintain

(int delta)

//向上維護子樹大小

directory *

mkdir

(string name)

bool

addchild

(directory *ch)

//加入子目錄並返回成功與否

directory *

rm(string name)

//刪除目錄並返回,刪除失敗返回空指標

directory *

cd(string name)

else

}else

else}}

voidsz(

)voidls(

)}void

tree()

for(

int i=

0;i)printf

("%s\n"

,ten-

>

at(i)

.c_str()

);}else

for(

int i=

0;i<

5;i++

)printf

("%s\n"

,ten-

>

at(i)

.c_str()

);printf

("...\n");

for(

int i=

9;i>=

5;i--

)printf

("%s\n"

,ten-

>

at(i)

.c_str()

);}}

private

:void

treeall

(vector

* bar)

//更新全桶

void

treefirstsome

(int num,vector

* bar)

//更新前序幾個

else

it++;}

}void

treelastsome

(int num,vector

* bar)

else

} bar-

>

push_back

(name);}

};struct command

;int type;

string name;

directory *tmpdir;

command

(string s)}}

};void

solve()

else

break;}

case2:

else

break;}

case3:

case4:

case5:

case6:

}printf

(ok ?

"ok\n"

:"err\n");

}}}}

intmain()

return0;

}

A 咕咕東的目錄管理器

初始時,硬碟是空的,命令列的當前目錄為根目錄 root。目錄管理器可以理解為要維護一棵有根樹結構,每個目錄的兒子必須保持字典序。在命令列下執行以下 中描述的命令 命令 型別 實現 說明 mkdir s 操作 在當前目錄下建立乙個子目錄 s,s 是乙個字串 建立成功輸出 ok 若當前目錄下已有該子目錄...

week9 作業A 咕咕東的目錄管理器

咕咕東的雪梨電腦的作業系統在上個月受到宇宙射線的影響,時不時發生故障,他受不了了,想要寫乙個高效易用零bug的作業系統 這工程量太大了,所以他定了乙個小目標,從實現乙個目錄管理器開始。前些日子,東東的電腦終於因為過度收到宇宙射線的影響而宕機,無法寫 他的好友tt正忙著在b站看貓片,另一位好友瑞神正忙...

Week9作業 A 咕咕東的目錄管理器 模擬

咕咕東的雪梨電腦的作業系統在上個月受到宇宙射線的影響,時不時發生故障,他受不了了,想要寫乙個高效易用零bug的作業系統 這工程量太大了,所以他定了乙個小目標,從實現乙個目錄管理器開始。前些日子,東東的電腦終於因為過度收到宇宙射線的影響而宕機,無法寫 他的好友tt正忙著在b站看貓片,另一位好友瑞神正忙...