數據結構 棧以及出棧算法

基本概念


   棧(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]存儲,初始棧頂指針topn+1,則下面x進棧的正確操作是:

   

       Atop:=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          

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章