基本概念
棧(stack)在計算機科學中是限定僅在表尾進行插入或刪除操作的線性表。
棧是一種數據結構,是隻能在某一端插入和刪除的特殊線性表。它按照後進先出的原則存儲數據,先進入的數據被壓入棧底,最後的數據在棧頂,需要讀數據的時候從棧頂開始彈出數據(最後一個數據被第一個讀出來)。
棧是允許在同一端進行插入和刪除操作的特殊線性表。允許進行插入和刪除操作的一端稱爲棧頂(top),另一端爲棧底(bottom);棧底固定,而棧頂浮動;棧中元素個數爲零時稱爲空棧。插入一般稱爲進棧(PUSH),刪除則稱爲退棧(POP)。 棧也稱爲後進先出表(LIFO表)。
棧可以用來在函數調用的時候存儲斷點,做遞歸時要用到棧!
來幾道例題:
1.如果輸入序列爲1 2 3 4 5 6,試問能否通過棧結構得到以下兩個序列:4 3 5 6 1 2和1 3 5 4 2 6;請說明爲什麼不能或如何才能得到?
輸入序列爲123456,不能得出435612,其理由是,輸出序列最後兩元素是12,前面4個元素(4356)得到後,棧中元素剩12,且2在棧頂,不可能棧底元素1在棧頂元素2之前出棧。
得到135426的過程如下:1入棧並出棧,得到部分輸出序列1;然後2和3入棧,3出棧,部分輸出序列變爲:13;接着4和5入棧,5,4和2依次出棧,部分輸出序列變爲13542;最後6入棧並退棧,得最終結果135426。
2.上面例題不可能得到的出棧序列數目個數爲:6!-C(6,12)/7,其中可能得到序列是C(n,2n)/n+1;
3.若一個棧以向量V[1..n]存儲,初始棧頂指針top爲n+1,則下面x進棧的正確操作是:
A.top:=top+1; V [top]:=x B. V [top]:=x; top:=top+1
C. top:=top-1; V [top]:=x D. V [top]:=x; top:=top-1
這裏與嚴蔚敏老師的C語言版教材定義的棧不一樣,top=n+1的時候棧爲空,所以top=n時是指向棧頂,從高位開始;所以先指向棧頂,再把X存入棧頂,從上到下依次進棧。這裏初始化棧的時候top=n+1表示佔了一位,但是不賦值,平常我們自己初始化棧是把top和base指針賦空,如壓入一個元素則將top和base同時指向棧底,以後每壓入一個元素則將top指向新增的這個元素,而嚴蔚敏老師的C語言版教材則是定義top和base同時指向棧底時代表空棧,top指向新增加元素的後一位。
4.若棧採用順序存儲方式存儲,現兩棧共享空間V[1..m],top[i]代表第i個棧( i =1,2)棧頂,棧1的底在v[1],棧2的底在V[m],則棧滿的條件是( )。
A. |top[2]-top[1]|=0 B. top[1]+1=top[2]
C. top[1]+top[2]=m D. top[1]=top[2]
出棧順序解法
原題:
有四個元素a, b, c, d依次進棧,任何時候都可以出棧,請寫出所有可能的出棧序列。
該題有兩種思路:
1.直接找出所有正確的解;
2.在全集中排除不正確的解,剩餘的即爲正確解。我將要給出的是第二種思路——間接法求解的過程。
間接法的優點:可以對隨機輸入的一組序列進行判斷,看是否是正確的出棧序列。
間接法的缺點:如果要求解全部正確的出棧序列,需先求出全排列,然後用該判斷函數對全排列中的每一組序列進行檢驗,將正確的序列輸出。
簡介:
由於題目已經隱性規定“a在b先入棧,b在c先入棧,c在d先入棧,……”如果原始序列用s表示,那麼題目隱含條件可歸納爲“s[ i ]在s[ i + 1]先入棧”。因此,在出棧的時候,若若j < m < n < k,且s[ j ]和s[ k ]均已出棧,則s[ m ]必不可能在s[ n ]之前出棧。
例:
s = a, b, c, d
若出棧序列的前兩個元素是:c, d,則說明a, b還在棧中(a要退棧的前提是b先退棧),此時可以確定正確的出棧序列是:c, d, b, a。
檢測函數:
出棧順序解法From: http://blogger.org.cn/blog/more.asp?name=binaryluo&id=17452