(雖然我覺得沒有人會看我這篇東西,但是仍然聲明,如有雷同,喊我修改)
扯個蛋:出棧序列問題在數據結構課程試卷中一般會有一個1~2分的選擇題,我當年做這種題的時候從來不知道選對了沒有。
方法1.出棧順序312
小模型:對於一個進棧序列123,出棧的可能序列應該是這個序列的全排列的子集()
全排列是{123}{132}{231}{213}{321}{312},不合理的出棧序列只有{312}
分析:3首先出棧,則棧中還有1和2,且1位於2下面(別在這裏問爲什麼),此時2必定先出棧
結論:{312}的出棧序列是不可能的。
推廣:對於任意一個進棧序列 1,...i,...j,...k....N,(其中 1<=i<j<k<=N),不可能產生形如 ...k...i...j...的出棧序列
換句話說,就是任意的一個出棧序列假設中,如果有3個元素,他們入棧的先後順序是123,出棧順序是312,那麼這個出棧序列不可能。
一大堆廢話,搞的跟高數一樣。在數據結構考試裏,一般給出5~7個元素,應該很容易就可以用肉眼找出符合312規律的序列。
方法2.過程再現
文頭鏈接裏的文章給出的是一種再現入棧/出棧過程的方法。
既然是再現,那麼再現的時候是否具有唯一性呢?
小模型:對已一個進棧序列123,它的全部出棧可能和入/出棧操作如下
{123}:push(1),pop(1),push(2),pop(2),push(3),pop(3)
{132}:push(1),pop(1),push(2),push(3),pop(3),pop(2)
{213}:push(1),push(2),,pop(2),pop(1),push(3),pop(3)
{231}:push(1),push(2),pop(2),push(3),pop(3),pop(1)
{321}:push(1),push(2),push(3),pop(3),pop(2),,pop(1)
{312}:push(1),push(2),push(3),pop(3),pop()
猜想:對於一個合理出棧序列,有且僅有一個入棧出棧操作過程。(如上)
證明:(你確定真的需要麼)
推理:1.元素出棧↔元素位於棧頂;2.元素在進棧隊列→元素可以在經過有限次進棧操作後最後進入堆棧→元素位於棧頂
對於假設隊列中的第一個元素而言,只要這個元素目前位於棧頂或者可以通過進棧操作使這個元素位於棧頂,那麼對於到這個元素爲止的出棧假設是可行的,否則該假設是不可行的。依次使用該方法對假設隊列中的元素進行檢驗,就可以檢測最終的可行性。
過程重現方法
棧討論中,任意一個元素只能存在於進棧隊列、棧內、棧外3個對象池中的任意一箇中
算法:
1.所有棧元素按照入棧順序重新排列於入棧隊列中
2.對於待檢驗隊列的第一個元素,在棧內查找,如果在棧內,轉到2.1;不在棧內,轉到2.2
2.1如果元素位於棧頂,棧頂元素出棧,檢驗隊列首元素出隊列,轉到2.1.1;如果元素不位於棧頂,返回失敗(如上312)
2.2進棧隊列依次進棧,直到棧頂元素爲所求,轉到2.1。(如果不存在,那那個仁兄去哪裏了呢?)
2.1.1如果檢驗隊列空,返回成功,否則轉到2
爲了2分死這麼多腦細胞,總感覺有那麼些不對勁