A 咕咕東的目錄管理器

2021-10-05 09:14:15 字數 4224 閱讀 7366

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

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

在命令列下執行以下**中描述的命令:

命令 型別 實現 說明

mkdir s 操作 在當前目錄下建立乙個子目錄 s,s 是乙個字串 建立成功輸出 「ok」;若當前目錄下已有該子目錄則輸出 「err」

rm s 操作 在當前目錄下刪除子目錄 s,s 是乙個字串 刪除成功輸出 「ok」;若當前目錄下該子目錄不存在則輸出 「err」

cd s 操作 進入乙個子目錄 s,s 是乙個字串(執行後,當前目錄可能會改變) 進入成功輸出 「ok」;若當前目錄下該子目錄不存在則輸出 「err」

特殊地,若 s 等於 「…」 則表示返回上級目錄,同理,返回成功輸出 「ok」,返回失敗(當前目錄已是根目錄沒有上級目錄)則輸出 「err」

sz 詢問 輸出當前目錄的大小 也即輸出 1+當前目錄的子目錄數

ls 詢問 輸出多行表示當前目錄的 「直接子目錄」 名 若沒有子目錄,則輸出 「empty」;若子目錄數屬於 [1,10] 則全部輸出;若子目錄數大於 10,則輸出前 5 個,再輸出一行 「…」,輸出後 5 個。

tree 詢問 輸出多行表示以當前目錄為根的子樹的前序遍歷結果 若沒有後代目錄,則輸出 「empty」;若後代目錄數+1(當前目錄)屬於 [1,10] 則全部輸出;若後代目錄數+1(當前目錄)大於 10,則輸出前 5 個,再輸出一行 「…」,輸出後 5 個。若目錄結構如上圖,當前目錄為 「root」 執行結果如下,

undo 特殊 撤銷操作 撤銷最近乙個 「成功執行」 的操作(即mkdir或rm或cd)的影響,撤銷成功輸出 「ok」 失敗或者沒有操作用於撤銷則輸出 「err」

input:

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

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

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

output:

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

sample 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

sample output:

ok

errok

okok

okok

okok

okok

okok

okok

9dira

dirb

dirc

root

diraab

cdirb

xdircyok

root

dirb

xdircyok

root

diraab

cdirb

xdirc

y

資料結構有兩個:directory和command。directory儲存結點的結構,command儲存命令的結構。

mkdir:新建子目錄,先檢查是否已經存在,因為有可能撤銷,所以在新建子目錄的時候記錄新建的子目錄、命令、當前節點等。

rm:去掉連著之間的連線,但不會刪除某個節點。記錄有關命令的資訊。

cd:進入子目錄,記錄有關命令的資訊,便於後續反向行走。

sz:直接輸出當前節點記錄的以當前節點為根的子樹的大小。

ls:輸出節點記錄的pre和bck。

undo:從記錄的命令中取出最新的一條,不同的命令有對應的不同的撤銷操作。

#include

#include

#include

#include

#include

using

namespace std;

char tmps[20]

;struct directory

public

: directory*

getchild

(const string& name)

//取子目錄返回,不存在則返回空指標

directory*

mkdir

(const string& name)

//建立子目錄返回,建立失敗則返回空指標

directory*rm(

const string& name)

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

directory*cd(

const string& name)

bool

addchild

(directory* ch)

void

maintain

(int delta)

voidsz(

)voidls(

)}void

tree()

for(

int i =

0; i < subtreesize; i++

)printf

("%s\n"

, tendescendants-

>

at(i)

.c_str()

);}else

for(

int i =

0; i <

5; i++

)printf

("%s\n"

, tendescendants-

>

at(i)

.c_str()

);printf

("...\n");

for(

int i =

9; i >=

5; i--

)printf

("%s\n"

, tendescendants-

>

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 arg;

//命令的引數

directory* tmpdir;

//記錄剛剛操作涉及的目錄節點

command

(const string& s)}}

}};void

solve()

break;}

case2:

break;}

case3:

now-

>sz(

);break

;case4:

now-

>ls(

);break

;case5:

now-

>

tree()

;break

;case6:

}printf

(success ?

"ok\n"

:"err\n");

}}}}

intmain()

return0;

}

WEEK9 A 咕咕東的目錄管理器

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

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

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

程式設計Week9 A 咕咕東的目錄管理器

每組測試資料的輸出結果間需要輸出一行空行。注意大小寫敏感。以封裝的思想來實現每個小功能,由於有undo的操作,因此對於mkdir rm cd三種操作需要記錄每一次操作的過程 建立乙個目錄相關的結構體,其中包括檔名,當前檔案的子目錄的map,父節點以及當前檔案下子樹 目錄 的規模,當前目錄下先序遍歷 ...