問題描述
在作業系統中,資料通常以檔案的形式儲存在檔案系統中。檔案系統一般採用層次化的組織形式,由目錄(或者資料夾)和檔案構成,形成一棵樹的形狀。檔案有內容,用於儲存資料。目錄是容器,可包含檔案或其他目錄。同乙個目錄下的所有檔案和目錄的名字各不相同,不同目錄下可以有名字相同的檔案或目錄。
為了指定檔案系統中的某個檔案,需要用路徑來定位。在類 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% 的測試用例,需要正規化的路徑都是絕對路徑。
讀懂題意,發現主要難題有兩個。第乙個是對讀入的字串進行操作,將他們按照 『/』 為界分成乙個個字串並且儲存起來,第二個就是題目要求的規範路徑。
對於第乙個問題,我們可以採用對整體字串進行遍歷操作,然後得到兩個 『/』 之間的字串,但是有更簡單的方法,可以採用getline函式和輸入流。我們首先先採用getline函式將整體路徑讀入,為什麼要採用getline而不同cin的原因是cin無法讀入空格,而題目中允許路徑為空。我們將整體路徑讀入後,將這個字串的內容送到輸入流ss中,然後採用
getline
(ss, temp,
'/')
temp為我們將路徑按照 『/』劃分出的乙個個字串,getline的第三個引數是我們按照題意設立的終止符。要注意「/」字串getline並不會什麼都不讀入,他會給temp讀入長度為0的字串,要注意處理。
我們採用vector < string >陣列來記錄路徑中的資料夾的名字。最初的時候按照讀入將當前路徑存入起來。
對於第二個問題,首先我們設立乙個vector < string > road陣列用來儲存路徑。正式處理讀入路徑之前我們應該有乙個判斷,若是我們讀入的路徑的整體字串的第乙個為「 」,那麼按照題目要求此時應該輸出當前路徑,若是第乙個為「. .」,那麼意味著這個路徑是絕對路徑,需要將current陣列裡的內容先移動到road陣列裡。
接下來我們對路徑裡讀入的小字串進行處理,若是「.」,則不用管他,若是「 . .」,則需要對road進行處理,若road不為空,則pop掉最後乙個,若為空,則不處理。如果這些情況都不是那麼便是正常的資料夾名,我們將他加入到road陣列中。
getline函式設立終止符可以幫助我們對乙個長字串按照某個字元進行分割,可以有效的簡化**,但是對於兩個終止符中間沒有其他字元的情況,字串getline並不會什麼都不讀入,他會給temp讀入長度為0的字串,要注意處理。
要仔細讀懂題意,不要漏了要點,例如路徑為空則操作結果為當前路徑。
#include
#include
#include
#include
using
namespace std;
vectorcurrent;
vectorroad;
void
print
(vector
& t)
cout << endl;
}void
solve
(string& t,
bool judge)
//judge為false則需要用到當前路徑
}while
(getline
(ss, temp,
'/')
)//若是出現會自動忽略不會讀入
else
}print
(road);}
intmain()
for(
int i =
0; i < p; i++
)bool judge =
(temp[0]
=='/');
solve
(temp,judge);}
}
CSP 201604 3 路徑解析
試題編號 201604 3 試題名稱 路徑解析 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 在作業系統中,資料通常以檔案的形式儲存在檔案系統中。檔案系統一般採用層次化的組織形式,由目錄 或者資料夾 和檔案構成,形成一棵樹的形狀。檔案有內容,用於儲存資料。目錄是容器,可包含檔案...
CSP201604 3路徑解析
給出一系列檔案路徑,輸出正規化後的路徑。有分析可知,給出的路徑只有兩種形式,一是絕對路徑 以 開頭 二是相對路徑 以 開頭 對於相對路徑的處理,可以將它與當前目錄連在一起,變成絕對路徑後再正規化,根據分析得出將乙個路徑 絕對路徑 正規化要考慮到以下四點 路徑中是否出現 路徑中是否出現 路徑中是否出現...
CSP 201604 3路徑解析
問題描述 輸入格式 第一行包含乙個整數 p,表示需要進行正規化操作的路徑個數。第二行包含乙個字串,表示當前目錄。以下 p 行,每行包含乙個字串,表示需要進行正規化操作的路徑。輸出格式 共 p 行,每行乙個字串,表示經過正規化操作後的路徑,順序與輸入對應。樣例輸入 7 d2 d3 d2 d4 f1 d...