策略
設計乙個順序棧,附設的top指標有兩種策略:
借助一篇文章深入分析二者的異同。
top指向棧頂
首先令top指向當前棧頂元素,這樣進來乙個新的元素時,新元素不能佔據當前top指向的位置,需要把top指標挪一挪,一般是top++,但不排除題目中設計的是top–,不管怎樣,都是把top指標往棧外拓展乙個空位,虛位以待新成員。
出去乙個新元素時,取出當前棧頂元素,也就是top值不能先變化,因為top表示的就是棧頂元數,取棧頂元素必須借助於top。
再看特殊情況:空棧時top值是什麼?
這個很容易倒推:棧中有乙個元素時,top = 0,那麼棧空時,top = -1。
所以top = -1也是棧空的標識。
簡單說,策略就是:進棧時top先動以拓展位置,出去時先取資料再動top。這樣的策略就可以鎖定:top指向的是棧頂結點了。
top指向棧頂上方空位
這種方式下,我們看一般情況下的插入:因為top指向的是當前棧頂的上方空位置,進來新朋友時,不必先拓展位置,因為早就未雨綢繆準備好了,直接放上來即可!top這個位置進來新的元素後,它就不能再招待這個新朋友了,它還需要準備下一次的未雨綢繆呢!因此,是先進資料,再更新top值。
而出棧元素的時候,就該明確,top並沒有指向棧頂元素,棧頂元素必須借助top才能抓住,因此,top先收縮,可能是++,也可能是–,這不是核心。
那麼空棧時候,top = 0,表示指向-1位置的上方。
簡單說:進棧時,資料先進後調節top指標,出棧時先調節top指標,再取資料,便是:top指向的是棧頂外部的策略了!
應當看出這裡的pattern,進出的指標更改順序都是相反的。即:進來先改出去後改,反之亦然。
但是背後的邏輯也是很值得思考的。
在組成原理中的運用
以上是在資料結構中的分析,下面對應的例題是在組成原理中的運用。
堆疊定址中,設a是累加器,sp是堆疊指示器,ms有了上面的鋪墊,這個幾乎不用多說。但是請看題中有一句話很有錯誤的引導作用,讓你相信了sp指向的是棧頂單元!p 是sp指示的棧頂單元。如果進棧操作是:(a
)−>ms
p,(s
p)−1
−>sp
,那麼出棧的動作應該是:(s
p)+1
−>sp
,(ms
p)−>
a 。
ms
p 是sp指示的棧頂單元
但是一分析,進棧時候,資料先進,位置後動,表示的是sp指向的是棧頂上方的空位。
所以,出棧時必須是先收縮sp,這裡的外推是(s
p)−1
,那麼自然收縮就是相反的(s
p)+1
,再把資料交給ms
p .
以上。
n個元素進棧,出棧順序問題
近日在複習資料結構,看到棧的時候,發現1個元素進棧,有1種出棧順序 2個元素進棧,有2種出棧順序 3個元素進棧,有5種出棧順序,那麼乙個很自然地問題就是n個元素進棧,共有多少種出棧順序?說來慚愧,以前學資料結構的時候竟然沒有考慮過這個問題。最近在看動態規劃,所以 子問題 這3個字一直在我腦中徘徊,於...
進棧出棧規則
先弄個例子 已知元素的入棧順序為abcde,則下列哪種出棧順序是不可能的 出棧和入棧操作可交叉進行 a edcba b cabde c dcbae d bcdea 先進後出,後進先出 在原序列中相對位置比它小的,必須是逆序 在原序列中相對位置比它大的,順序沒有要求 以上兩點可以間插進行。a選項正確 ...
進棧與出棧
問題描述 有四個元素abcd依次入初始為空的棧中,入棧之後可停留,可出棧。最後所有元素都出棧,請分析並寫出所有可能的分別以a,b,c,d開頭的出棧序列。首先分析以a開頭的出棧序列。序列前兩位無非3種 ab,ac,ad。再分別分析這三種開頭的序列分別對應著幾種可能序列。ab顯然有abcd和abdc兩種...