1. 程式人生 > >棧--進棧,出棧指標修改的順序問題

棧--進棧,出棧指標修改的順序問題

策略

設計一個順序棧,附設的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是堆疊指示器,Msp是SP指示的棧頂單元。如果進棧操作是:(A)>Msp,(SP)1>SP,那麼出棧的動作應該是:(SP)+1>SP,(Msp)>A

有了上面的鋪墊,這個幾乎不用多說。但是請看題中有一句話很有錯誤的引導作用,讓你相信了SP指向的是棧頂單元!
Msp是SP指示的棧頂單元
但是一分析,進棧時候,資料先進,位置後動,表示的是SP指向的是棧頂上方的空位。
所以,出棧時必須是先收縮SP,這裡的外推是(

SP)1,那麼自然收縮就是相反的(SP)+1,再把資料交給Msp.

以上。