week9 A 目錄管理器

2021-10-05 10:08:15 字數 4432 閱讀 4542

自己寫乙個目錄管理器,要求可以進行以下的操作。

命令型別

實現說明

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 個。

undo

特殊撤銷操作

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

輸入要求:

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

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

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

輸出要求:

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

樣例輸入:

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

樣例輸出:

ok

errok

okok

okok

okok

okok

okok

okok

9dira

dirb

dirc

root

diraab

cdirb

xdircyok

root

dirb

xdircyok

root

diraab

cdirb

xdirc

y

用樹結構來維護目錄管理器,但是這裡沒有必要寫乙個完整的樹的類,因為只是針對乙個小的程式設計問題。

定義乙個結點的結構體,對應於每個目錄。它有孩子結點,用 map 維護。將所有操作在該結構體中進行維護,另外,設定乙個布林型變數updated,用於判斷當前目錄子樹大小有沒有被更新。

mkdir:在當前目錄下增加孩子,並且將指標指向新建目錄,同時從前驅目錄更新大小。

rm:找到對應的孩子目錄,並刪除該目錄及其孩子目錄。

cd:轉到孩子目錄或者父目錄。

sz:直接返回當前子目錄的大小。

ls:遍歷當前目錄的孩子,並進行輸出。

#include

#include

#include

#include

using

namespace std;

// ctlog - 目錄結構體

struct ctlog

void

maintain

(int delta)

ctlog*

getchild

(string s)

ctlog*

mkdir

(string s)

ctlog *ch =

newctlog

(s,this);

children[s]

= ch;

maintain(1

);return ch;

} ctlog*

rm(string s)

maintain(-

1* it-

>second-

>treesz)

; children.

erase

(it)

;return it-

>second;

} ctlog*

cd(string s)

return

getchild

(s);

}voidsz(

)voidls(

)else

if(sz <=10)

else

cout <<

"..."

<< endl;

it = children.

end();

for(

int i =

0; i <

5; i++

) it--

;for

(int i =

0; i <

5; i++

, it++)}

} vector tendescendant;

void

treeall

(vector

* vec)

void

treeformer

(int num, vector

* vec)

else

it++;}

}void

treelatter

(int num, vector

* vec)

else

} vec-

>

push_back

(file_name);}

void

tree()

else

if(treesz <=10)

for(

int i =

0; i < treesz; i++

) cout << tendescendant.

at(i)

<< endl;

}else

for(

int i =

0; i <

5; i++

) cout << tendescendant.

at(i)

<< endl;

cout <<

"..."

<< endl;

for(

int i =

9; i >=

5; i--

) cout << tendescendant.

at(i)

<< endl;}}

bool

addchild

(ctlog* c)

children[c-

>file_name]

= c;

maintain

(c->treesz)

;return

true;}

};struct command

} ctlog* tmpdir;

// 剛才操作對應的目錄結點};

intmain()

else

break;}

case2:

break;}

case3:

break;}

case4:

case5:

case6:

case7:

case2:

case3:

}}if(success) cout <<

"ok"

<< endl;

else cout <<

"err"

<< endl;

break;}

}}}}

Week9 A 目錄管理器

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

WEEK9 A 咕咕東的目錄管理器

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

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

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