簡體   English   中英

CS,Java:數組實現的堆棧數據結構如何增長(向上,向下)? 分析

[英]CS, Java: How an array implemented stack data structure can grow (upwards, downwards)? analyze

讓我們看兩個真實的例子

模式1:考慮在一家自助餐廳購買餐盤; 這些板存放在桌子的下面,想象一條水平線代表台面和一個將板向上推的彈簧。 當將板從堆棧頂部移出時,下方的彈簧會導致下一個板移至頂部,而下方的所有板都將向上移動一個位置

模式2:考慮一堆書在桌子上; 想象一條水平線代表桌面。 在這種情況下,當從書架中取出一本書時,書架中的其余部分不會像在印版示例中那樣移動

最近,我收到一個有關在實現槽Java數組堆棧數據結構時分析上述兩個模型之間差異的問題。 我回應了,但想知道我的回應是否遺漏了什么

PS:我想這個問題對其他人也可能有用

最好的祝福

哈里·GT·卡爾

模型1:想象一下,我在頂部和底部有兩個箭頭,分別指示堆棧的頂部和底部元素。 因此變量top和bottom分別包含top和bottom元素的數組索引。

從堆疊頂部移出板時,請注意,指向頂板的指針並未移動,而僅指向底部的指針移動了。

讓我們將其轉換為包含四個整數的六元素數組

[0]     7       0   top

[1]     11

[2]     18      

[3]     23      3   bottom

[4]

[5]

[6]
  • 現在,如果刪除了頂部元素,則必須將整數11從第一個位置復制到第零個位置,然后將整數18從第二個位置復制到第一個位置,依此類推。 最后,變量底部需要從3更改為2。

  • 關於堆中的最后一個元素,實際上整數23的副本仍將位於數組的位置3,因為它只是從一個數組元素位置復制到另一個位置。 但是,現在位於2的變量bottom表示堆棧的底部,而不是數組中的項目數。

  • 請注意,在從堆棧中刪除所有項目時,bottom將為-1,top將保持為0。

缺點:

如果不是堆棧中只有四個項目,而是堆棧中有100個項目的100元素數組怎么辦? 要僅刪除堆棧中的一項,則需要復制99項。

要推斷,如果堆棧中有n個項目,則需要移動n − 1個項目。 這是一個O(n)過程。 顯然,這意味着隨着項目數量的增加,這種設計的效率不足。 即使以上內容對於少量項目似乎效果很好,但在設計數據結構時必須考慮的一件事是如何處理大量項目。

模型2:在這種情況下,當從書架中取出一本書時,頂部向下移動一個位置(與底部在模型1中向上移動相反),底部不移動

讓我們用一個數組來表示這個模型:

[6]

[5]

[4]     

[3]     7       3   top     

[2]     11

[1]     18

[0]     23      0   bottom
  • 首先,請注意,通常會繪制一個數組,上面的第零個元素,后面的元素在后,就像前面的示例一樣,但是上面的數組在底部有第零個元素。 這樣做的原因是,當使用數組表示堆棧時,在底部繪制第零個元素通常更方便,因此在添加項目時,將它們添加到下一個更高的數字索引中,看起來更像物理堆棧。

  • 這會影響計算機上的處理嗎? 不可以,因為它的繪制方式對處理沒有影響。 用這種方式繪制數組僅對於程序員查看更為方便。

  • 另外,請注意,在此示例中,這些數字也沒有顛倒0和3的倒數。

  • 當從堆棧中除去最高的數字7時,top的值將從3變為2。實際上已經從堆棧中彈出了7,但是整數7仍位於元素3中。堆棧,但只減少了top。

  • 由於top現在是2,因此定義堆棧數據結構的頂部的是頂部,而不是數組中的頂部。

優點

此模型的優勢在於,無論堆棧中有四個,一百個還是一千個項目,都不需要復制任何項目。 因此,如果堆棧中有n個項目,則該過程將不是O(n),而是常數O(1)。

PS:這是關於數組和作為數據結構的堆棧之間的區別的重要一點: 數組僅實現數據結構,但是它是所有變量和構成數據結構的算法的組合。

資料來源:主要來自

JT Streib和T. Soma,數據結構指南

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM