回覆列表
  • 1 # 使用者2458114238191884

    樓主,堆疊是一個抽象資料型別,規定的兩項必備的基本操作分別為入棧和出棧。這個抽象資料型別並沒規定入棧與出棧具體要怎麼實現。你問的問題已經在實現這一層面上,所以按照堆疊這種抽象資料型別的規定看,“先修改指標,然後插入資料,出棧時剛好相反”並不是必須的,這取決於你的操作的具體實現。

    如果你的堆疊的實現是往上長的(就是說往頂的方向長,其實質是你的棧底是定死的不能動,入棧的東西只能不斷往上疊,這就像你在書桌上放書一樣,桌底是定死的,所以你的書只能一本一本地往上堆,往上長),計算機內部的堆疊的實現採取的就是這種模式,所以就得像你說的那樣,“先修改指標,然後插入資料,出棧時剛好相反”,因為你堆疊指標指向的總是棧頂元素,棧底不能動,所以資料入棧前要先修改指標使它指向新的空餘空間然後再把資料存進去,出棧的時候自然相反,你聯絡我上面舉的放書的例子仔細想想。

    然而,如果你的堆疊的實現是往下長的(就是說你每壓一個元素入棧,棧底就自動下移一個元素的位置,其實質就是這種堆疊模型是一個“無底洞”型),這個時候,你的棧頂就變成了定死的,你就可以先壓入元素,然後再修改指標。因為你的棧底是無限的,你壓入一個元素,新的元素就取代先前的棧頂元素佔據棧頂的位置,那麼你先前的指向棧頂元素的指標這個時候就該修改讓它指向這個新的棧頂元素了。

    下面的就是對“無底洞”型堆疊的一種實現的描述:

    壓棧(入棧):將物件或者資料壓入棧中,更新棧頂指標,使其指向最後入棧的物件或資料。

    話說回來,計算機內部肯定選第一種模型,不會選第二種,因為第二種模型,每壓入一個新的元素,都需要把之前堆疊裡的所有元素整體下移動一個元素的位置,騰出棧頂元素的位置讓新的元素進來,這種平移可是一筆不小的開銷啊!但是並不是說“無底洞”模型就沒辦法實現了,其實它可以透過第一種模型來模擬的,每需要壓入一個新的元素的時候,就先開闢一個空間,資料存入這個空間,然後再修改棧頂元素指標使其指向這個新的棧頂元素。

    換句話說,用連結串列的話,只要有足夠的空間可開闢出來作為一個節點,那麼兩種堆疊模型都能實現(當然“無底洞”型還是如我上面說的那樣用第一種模擬出來的,否則平移的工作量相當可觀),如果用陣列,由於陣列在記憶體中是連續分配出來的空間,用第一種模型更自然一些。

  • 中秋節和大豐收的關聯?
  • 10歲女生400米跑1分22秒成績正常嗎?