資料結構 棧以及出棧演算法

2021-05-22 01:29:54 字數 2004 閱讀 7588

棧(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]:=xb.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]=md. 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

資料結構 棧的入棧 出棧序列

輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否可能為該棧的彈出順序。假設壓入棧的所有數字均不相等 例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的乙個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。思路 每次將入棧序列乙個元素入棧...

資料結構與演算法 出棧序列統計

總時間限制 100ms 記憶體限制 64kb 描述 棧是常用的一種資料結構,有n個元素在棧頂端一側等待進棧,棧頂端另一側是出棧序列。你已經知道棧的操作有兩種 push和pop,前者是將乙個元素進棧,後者是將棧頂元素彈出。現在要使用這兩種操作,由乙個操作序列可以得到一系列的輸出序列。請你程式設計求出對...

資料結構演算法 棧

棧是一種操作受限的線性表,在我們平時的日常生活中,可以看到許多與之相似的場景。比如一層一層疊起來的盤子,我們網上疊的時候,是乙個個乙個向上疊加,我們在取的時候,也是從最上面乙個乙個拿走。不能從中間直接抽取 這種滿足先進者後出,後進者先出的就是棧結構 因為只允許在一端插入和刪除,所以這是一種操作受限的...