CS,Java:数组实现的堆栈数据结构如何增长(向上,向下)?分析

时间:2018-08-18 13:02:51

标签: data-structures stack computer-science

让我们看两个真实的例子

模型1: 考虑一家自助餐厅,您可以在这里用餐。这些板存放在桌子的下面,想象一条水平线代表台面和一个将板向上推的弹簧。 当从堆叠顶部移走印版时,下面的弹簧会导致下一个 板移动到顶部,下面的所有板都向上移动一个位置

模型2: 考虑一堆书在桌子上。想象一条水平线代表桌面。 在这种情况下,当从书架中取出一本书时,其余书架 不会像平板示例中那样移动

最近我收到一个有关分析上述两个模型在实现槽式Java数组堆栈数据结构中的差异的问题。我回应了,但想知道我的回应是否遗漏了一些东西

PS:我想这个问题对其他人也可能有用

最好的问候

Harry G.T.卡尔

1 个答案:

答案 0 :(得分:0)

模型1: 想象一下,我在顶部和底部有两个箭头,分别指示堆栈的顶部和底部元素。因此变量top和bottom分别包含top和bottom元素的数组索引。

从堆叠顶部移走印版时 请注意,指向顶板的指针没有移动,而是仅指向底部的指针移动了。

让所有内容转换为包含四个整数的六元素数组

[0]     7       0   top

[1]     11

[2]     18      

[3]     23      3   bottom

[4]

[5]

[6]
  • 现在,如果删除了顶部元素,则必须将整数11从第一个位置复制到第零个位置,然后将整数18从第二个位置复制到第一个位置,依此类推。最后,变量bottom需要从3更改为2。

  • 关于堆中的最后一个元素,实际上,整数23的副本仍将位于数组的位置3,因为它只是从一个数组元素位置复制到另一个位置。 但是,现在位于2的变量bottom表示堆栈的底部,而不是数组中的项目数。

  • 请注意,从堆栈中删除所有项目时,bottom将为−1,top将保持为0。

缺点:

如果堆栈中不是100个元素数组,而不仅仅是堆栈中的4个元素怎么办? 要仅删除堆栈中的一项,则需要复制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,因此它定义了堆栈数据结构的顶部,而不是数组中的顶部。

PROS

此模型的优势在于,无论堆栈中有四个,一百个还是一千个项目,都不需要复制任何项目。因此,如果堆栈中有n个项目,则该过程将不是O(n),而是常数O(1)。

PS:以下是关于 数组和堆栈之间作为数据结构的区别:数组仅实现数据结构,但是它是所有变量和构成数据结构的算法的组合。

来源:主要来自

J。 T. Streib和T. Soma,数据结构指南