2013-03-01 49 views
1

我有幾個關於堆棧的問題。有一件事我不明白關於堆棧的問題是「流行」和「推動」的想法。假設我有整數a和b,堆棧上面有一個b。爲了訪問b,據我所知,必須從堆棧中彈出才能訪問b。所以當彈出堆棧時存儲「a」的位置。堆棧如何工作?

另外,如果堆棧內存比堆內存更高效地訪問,爲什麼堆內存結構不像堆棧?謝謝。

+0

堆的結構不像堆棧,因爲你不能像堆棧那樣構造內存,並且仍然使用它來堆什麼。 – delnan 2013-03-01 23:02:38

回答

1

所以當彈出堆棧時存儲「a」的位置。

這取決於。它正在閱讀堆棧的程序決定的地方。它可以存儲值,忽略它,打印它,任何東西。

另外,如果堆棧內存比堆內存更高效地訪問,爲什麼 不是堆內存結構像堆棧?

堆棧的訪問效率並不比堆高,這取決於使用情況。程序的流程變得越來越深,就像堆棧一樣變得越來越淺。在主流語言中,局部變量,參數和返回地址是以棧結構存儲的,因爲這種結構更容易實現我們稱之爲函數棧幀的語義。一個函數可以非常有效地訪問自己的棧幀,但不一定是它的調用者函數的棧幀,也就是整個棧。

另一方面,如果以這種方式實現堆,堆將是低效的,因爲希望堆能夠訪問並可能刪除任何地方的項目,而不僅僅是從頂部/底部。

1

我不是專家,但你可以想到像Tower of Hanoi這樣的謎題。要訪問較低的光盤,您需要在其上方「彈出」光盤,並將它們放置在其他位置 - 在這種情況下,放置在其他堆疊上,但在編程時它可能只是一個簡單的變量或指針或任何東西。當你有需要的物品時,其他物品可以放回堆疊或完全移到其他地方。

+1

好的謝謝。但是我仍然不明白在哪裏放置了「彈出」的變量。 – Iowa15 2013-03-01 23:02:02

+0

@愛荷華州15我還是不明白。我的頭腦和你的問題一樣。 – 2015-04-05 19:12:08

1

a存儲在任何你決定存儲的地方。 :-)您需要提供一個變量,用於在刪除堆棧頂部的值(a)時將其存儲在該變量中,然後刪除下一個項目(b)並將其存儲在其他變量中以使用它,然後將第一個值(a)推回棧中。

在你的左邊櫃檯上看到一堆髒盤子。你選擇一個來清洗它(將它從「髒」堆棧中彈出),清洗乾淨它,然後將它放在清潔堆棧的頂部(將其推到右側)。

如果你想從任何一個堆棧的頂部到達第二個板塊,你必須移動頂部的一個才能到達它。所以你撿起它(彈出它),暫時放在某個地方,拿起下一個盤子(彈出它)並放在某個地方,然後把第一個放回堆上(將它推回堆疊)。

如果你不能用盤子拍照,可以使用一副撲克牌(或棒球卡,或者一疊紙 - 任何你可以整齊堆放的東西(「堆疊」)),然後把它放在你的桌子上你的左手。然後執行我最後一段中的步驟,用「卡」替換單詞「plate」並物理執行這些步驟。

所以訪問b,聲明一個變量來存儲a中,流行a並將其保存在該變量,彈出b到它自己的變量,然後推回a到堆棧中。

+0

那麼你存放板塊的臨時地點在哪裏? – Iowa15 2013-03-01 23:07:21

+1

請再次閱讀我在最後一段中的內容,然後仔細想想。用盤子拍照,用左手拿起頂板(一個臨時存放位置,在編程時是一個變量),抓住右邊的一個(一個不同的變量),然後從左邊拿一個手回到堆上。 – 2013-03-01 23:11:32

1

讓我們看看你的情況。

你必須與它ň元素堆棧,最後一個是一個b是下面。

彈出操作返回彈出值,所以如果你想從頂部是b訪問第二個,你可以這樣做:

var temp = stack.pop() 
var b = stack.pop() 
stack.push(temp) 

然而,堆棧將很少使用這種方式。這是一個LIFO隊列,在像LIFO隊列一樣訪問時效果最好。

看來你寧願需要一個基於隨機索引的訪問集合。 該集合可能會存儲在堆上。希望它澄清堆棧彈出/推一點。