在作業系統中,資料通常以檔案的形式儲存在檔案系統中。檔案系統一般採用層次化的組織形式,由目錄(或者資料夾)和檔案構成,形成一棵樹的形狀。檔案有內容,用於儲存資料。目錄是容器,可包含檔案或其他目錄。同乙個目錄下的所有檔案和目錄的名字各不相同,不同目錄下可以有名字相同的檔案或目錄。
為了指定檔案系統中的某個檔案,需要用路徑來定位。在類 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% 的測試用例,需要正規化的路徑都是絕對路徑。
這個題看上去非常的麻煩,讀題的難度還是挺大的,當題目讀清楚之後就會發現是乙個字串的處理問題,主要需要處理以下幾種情況:
輸出問題,因為棧中的元素是先進後出的,需要先輸出的元素處理完之後都在棧底,因此可以再使用乙個棧將元素壓入,然後用新的棧來輸出。
輸入問題
輸入問題:本來到這裡結束了,但是只有90分,後來再審題,發現題目有空字串的情況,是以上討論所沒有覆蓋的,由於空字串直接輸出當前目錄。因此接下來的問題就是如何判定空字串,用cin 顯然不行,諮詢後是getline(cin,s)
;輸入一行字串,換行開始,預設換行結束。但是這事意味著在輸入當前目錄時有乙個換行在緩衝區,因此需要cin.ignore()
來去除。同時用(int)s.size()
來判定輸入的是不是空字串。
輸入問題getline
#include
#include
#include
using
namespace std;
string str,s;
void
change()
int n=
(int
)s.size()
; s.
push_back
('/');
//字串末尾加/
n++; stack<
char
> st;
st.push
(s[0])
;//預處理
for(
int i=
1;i)else
if(s[i]
=='.'
)else
if(s[i-1]
=='/'
&&s[i+1]
=='.'
&&s[i+2]
=='/'
)else
}else
}else
}else
}//輸出
//char a;
stack<
char
> stt;
while
(!st.
empty()
)int size=stt.
size()
;if(size==1)
int i=1;
while
(icout<}int
main()
else
}return0;
}
第二次月模擬題 201604 3
題目描述 在作業系統中,資料通常以檔案的形式儲存在檔案系統中。檔案系統一般採用層次化的組織形式,由目錄 或者資料夾 和檔案構成,形成一棵樹的形狀。檔案有內容,用於儲存資料。目錄是容器,可包含檔案或其他目錄。同乙個目錄下的所有檔案和目錄的名字各不相同,不同目錄下可以有名字相同的檔案或目錄。為了指定檔案...
CodeVS第二次月賽 B
題目描述 description 切記不要加任何檔案讀寫,本次比賽暫不支援ifndef online judge。請互相轉告。評測機是linux 是個富有詩意的男孩。在他居住的小鎮上,有 n個村莊,由 n 1條道路連線著。這裡的生活和諧而又寧靜。有一天 tty偶然閱讀到一篇雜誌上的文章 陽光下的向日...
codeVS第二次月賽 C
題目描述 description 切記不要加任何檔案讀寫,本次比賽暫不支援ifndef online judge。請互相轉告。評測機是linux jijijie是恐怖的科學怪人,他有特殊的 科技 song ci crash。dash在他的家庭農場裡擁有 n塊連續的擁有者黑色和金色混雜的 da shg...