演算法 與 資料結構 Algorithm and Data Structure
- Stack and Queue 堆疊與佇列
Data Structure,資料結構。
大概是這麼回事:演算法(algorithm)是處理問題時的核心想法,但有時候為了幫助這些想 法能夠有效運行,要使用一些特別的方式來儲存資料,以利於我們快速的 達成所需的操作、或快速得到我們需要的訊息。這樣的儲存資料方式,就稱 為資料結構(data structure)。
Array陣列算是一種最基本的鏈狀資料結構,支持我們快速取得與元素編
號相關的資料。而這邊要介紹的Stack和Queue也都是很基本常見的的鏈狀 資料結構;即使不特別implement(實作)它,在解決問題時常常也會用 到這樣的想法,例如搜尋方法的BFS和DFS。
Queue 佇列,FIFO (First-In-First-Out)
Queue在英文中的意思,也有排隊的「隊」的意思。沒錯,佇列就像排隊一樣,先來的人會最
先離開,而之後來的人都只能排在隊伍的末端,而且得最後離開。Queue就是這樣的資料結 構,用陣列來implement,通常用head和tail或者front和rear分別代表Queue的前端(取得 資料)和末端(加入新資料)。而Queue支持兩個動作:Push和Pop(也可以寫作Enqueue
和Dequeue),Push是把新的資料從rear加入,Pop則是把資料從head取出。
Stack 堆疊,FILO (First-In-Last-Out)
想像一些箱子排成一堆,每次可以把新的箱子堆到這堆箱子的最頂層,或是把最頂層的箱子 拿下來、取走,這就是堆疊。堆疊是個鏈狀資料結構,其特性在於,加入資料時,一定是加 在資料末端,且取用和刪除資料時,也只能對最末端的資料進行操作。
實行上(implementing)十分容易,用陣列就可達成,C++函式庫也有提供。一般我們用一個
陣列Stack[0…n]儲存資料,用一個變數top代表資料頂端,也就是第一個沒有資料的index。
雖然實行上容易,可不要因此小看了Stack!即使是如此的簡單明瞭,Stack的性質可以讓我 們方便的解決許多問題!
題目一 – 火車調動 (ACM 514)
堆疊市的火車站長得如上圖一般。火車車廂由A處依1, 2, 3, …, n的順序進站。如今給定一個
建中資訊培訓講義 (五) - by kelvin
1到n的重排,試問是否能在Station處經過一些調度,使火車依照這樣的重排順序出站。
題目二 – 加強版火車調動 (TIOJ 1012, Rails)
超級堆疊市的火車站長得如上圖一般。除了Station處可以容納火車車廂以外,停在station中 的車廂還可以開進Spare Railway中,但由於長度限制,Spare Railway最多只能容納m節車 廂。火車車廂由A處依1, 2, 3, …, n的順序進站。如今給定m和一個1到n的重排,試問是否 能使火車依照這樣的重排順序出站?
題目三 – 合法括弧
有若干種括弧,如(), [], {}, <>。給定一串括弧,試問其是否為合法?(能不交錯地配對)
例如({<()[]()>[]})是合法的,([])和<>>和[[]都是不合法的。
註:長度為n由’(‘和’)’構成的合法括弧字串──卡特蘭數Catalan Number。
題目四 – 文法規則 (ACM 271, Simply Syntax) 某個語言的文法規則如下:
0. 這個語言中僅有 p 到 z,還有 N,C,D,E,I 這幾個字母。
1. 從p到z中,任何一個字母都是一個正確的句子。
2. 如果s是一個正確的句子,那麼 Ns 也是。
3. 如果s及t都是正確的句子,那麼Cst, Dst, Est還有Ist也都是正確的句子。
4. 以上三點是檢查一個句子是否合乎語法僅有的規則。
你被要求寫程式檢查一個句子是合乎文法。
題目五 – 運算式 (ACM 727, Equation)
將一個中置運算式in-order改成後置運算式post-order。(運算元最多只有一位數)
中置運算式:其實就像我們一般寫的式子,可以有括弧,如(3+2)5、((1+2)(3+4)+5)(6+7) 後置運算式:運算子放在運算元後,沒有括弧,如32+5、12+34+5+67+。
題目六 – 數列中每個數其後第一個比它小的數 (小品演算法!!) - O(n)
給定一串數列有n個數,試在O(n)時間求出每個數在它之後第一個比它小的數是多少?
建中資訊培訓講義 (五) - by kelvin
例如對數列2, 0, 7, 8, 3, 6, 4, 5, 4, 1,求出的結果是0, -, 3, 3, 1, 4, 1, 4, 1, -。
題目七 – 最大0組成長方形 (USACO Section 6.1, A Rectangular Barn) …O(n2)?!
在一個零一矩陣中(長度不大於1000),找一塊最大的長方形,裡面全部都是0。
試問這樣的長方形最大的面積為多少?
[完]
建中資訊培訓講義 (五) - by kelvin