自己寫乙個目錄管理器,要求可以進行以下的操作。
命令型別
實現說明
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,父節點以及當前檔案下子樹 目錄 的規模,當前目錄下先序遍歷 ...