在作業系統中,資料通常以檔案的形式儲存在檔案系統中。檔案系統一般採用層次化的組織形式,由目錄(或者資料夾)和檔案構成,形成一棵樹的形狀。檔案有內容,用於儲存資料。目錄是容器,可包含檔案或其他目錄。同乙個目錄下的所有檔案和目錄的名字各不相同,不同目錄下可以有名字相同的檔案或目錄。
為了指定檔案系統中的某個檔案,需要用路徑來定位。在類 unix 系統(linux、max os x、freebsd等)中,路徑由若干部分構成,每個部分是乙個目錄或者檔案的名字,相鄰兩個部分之間用 / 符號分隔。
有乙個特殊的目錄被稱為根目錄,是整個檔案系統形成的這棵樹的根節點,用乙個單獨的 / 符號表示。在作業系統中,有當前目錄的概念,表示使用者目前正在工作的目錄。根據出發點可以把路徑分為兩類:
ÿ 絕對路徑:以 / 符號開頭,表示從根目錄開始構建的路徑。
ÿ 相對路徑:不以 / 符號開頭,表示從當前目錄開始構建的路徑。
例如,有乙個檔案系統的結構如下圖所示。在這個檔案系統中,有根目錄 / 和其他普通目錄 d1、d2、d3、d4,以及檔案 f1、f2、f3、f1、f4。其中,兩個 f1 是同名檔案,但在不同的目錄下。
對於 d4 目錄下的 f1 檔案,可以用絕對路徑 /d2/d4/f1 來指定。如果當前目錄是 /d2/d3,這個檔案也可以用相對路徑 …/d4/f1 來指定,這裡 … 表示上一級目錄(注意,根目錄的上一級目錄是它本身)。還有 . 表示本目錄,例如 /d1/./f1 指定的就是 /d1/f1。注意,如果有多個連續的 / 出現,其效果等同於乙個 /,例如 /d1///f1 指定的也是 /d1/f1。
本題會給出一些路徑,要求對於每個路徑,給出正規化以後的形式。乙個路徑經過正規化操作後,其指定的檔案不變,但是會變成乙個不包含 . 和 … 的絕對路徑,且不包含連續多個 / 符號。如果乙個路徑以 / 結尾,那麼它代表的一定是乙個目錄,正規化操作要去掉結尾的 /。若這個路徑代表根目錄,則正規化操作的結果是 /。若路徑為空字串,則正規化操作的結果是當前目錄。
輸入格式
第一行包含乙個整數 p,表示需要進行正規化操作的路徑個數。
第二行包含乙個字串,表示當前目錄。
以下 p 行,每行包含乙個字串,表示需要進行正規化操作的路徑。
輸出格式
共 p 行,每行乙個字串,表示經過正規化操作後的路徑,順序與輸入對應。
樣例輸入
7
/d2/d3
/d2/d4/f1..
/d4/f1
/d1/
./f1
/d1///f1
/d1/
////d1/..
/../d2
樣例輸出
/d2/d4/f1
/d2/d4/f1
/d1/f1
/d1/f1
/d1/
/d2
評測用例規模與約定
1 ≤ p ≤ 10。
檔案和目錄的名字只包含大小寫字母、數字和小數點 .、減號 - 以及下劃線 _。
不會有檔案或目錄的名字是 . 或 … ,它們具有題目描述中給出的特殊含義。
輸入的所有路徑每個長度不超過 1000 個字元。
輸入的當前目錄保證是乙個經過正規化操作後的路徑。
對於前 30% 的測試用例,需要正規化的路徑的組成部分不包含 . 和 … 。
對於前 60% 的測試用例,需要正規化的路徑都是絕對路徑。
看到題目是路徑解析以為是乙個圖論題,但轉念一想這是csp第三題,應該不會,果不其然。用string型別s儲存路徑,對字串的問題只需要考慮兩方面的問題:
(1)如果是絕對路徑,說明字串第乙個字元是『/』。對這樣的路徑字串,只需要將裡面多餘的『.』和『/』刪去(規格化的操作會在(3)中完成)。
(2)如果是相對路徑,說明字串第乙個字元不是『/』,那麼這個路徑肯定是基於當前目錄begin的,所以s=begin+"/"+s;
(3)之後為了獲正確規範的路徑,引入string型別的棧,將s以『/』為分割符號,把各個部分的字串壓棧,如果遇到「…」就要彈出棧中乙個元素,如果不是"…」就壓棧,待字串s所有的入棧完畢後,就將棧中的字串元素全部彈出儲存到vector陣列中,注意如果彈出的是『.』就不要儲存,最後將陣列倒序輸出並且每個輸出都重新 補上『/』即可。
#include
using
namespace std;
//實際就是去除不規範的斜槓和點
stack st;
vector v;
//儲存之後彈出棧的字串
intmain()
if(s[0]
!='/'
) s=begin+
'/'+s;
//相對路徑,存在返回上一級目錄,返回路徑後,首字元一定是'/'
這道題目我既用了棧又用了vector,後來看了同學的發現ta沒有用stl的棧,直接用vector模擬了乙個棧,這樣在最後輸出的時候,還能夠方便的直接輸出結果,我這裡卻還要單獨出棧並且用vector轉存。
CSP認證練習題 201703 2 學生排隊
問題描述 體育老師小明要將自己班上的學生按順序排隊。他首先讓學生按學號從小到大的順序排成一排,學號小的排在前面,然後進行多次調整。一次調整小明可能讓一位同學出隊,向前或者向後移動一段距離後再插入佇列。例如,下面給出了一組移動的例子,例子中學生的人數為8人。0 初始佇列中學生的學號依次為1,2,3,4...
練習題目2
1 將陣列a中的內容和陣列b中的內容進行交換 陣列一樣大 思路 新建乙個陣列作為中間陣列進行交換.如下 2 計算1 1 1 2 1 3 1 4 1 5 1 99 1 100的值.思路 通過每一輪迴圈給分子乘以 1來控制加數的正負號,計算出和.如下 3 編寫程式數一下1到199的所有整數 現過多少次數...
程式練習題 2
考慮如下的序列生成演算法 從整數 n 開始,如果 n 是偶數,把它除以 2 如果 n 是奇數,把它乘 3 加1。用新得到的值重複上述步驟,直到 n 1 時停止。例如,n 22 時該演算法生成的序列是 22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1。人們猜想 沒有...