让我们看两个真实的例子
模型1: 考虑一家自助餐厅,您可以在这里用餐。这些板存放在桌子的下面,想象一条水平线代表台面和一个将板向上推的弹簧。 当从堆叠顶部移走印版时,下面的弹簧会导致下一个 板移动到顶部,下面的所有板都向上移动一个位置
模型2: 考虑一堆书在桌子上。想象一条水平线代表桌面。 在这种情况下,当从书架中取出一本书时,其余书架 不会像平板示例中那样移动。
最近我收到一个有关分析上述两个模型在实现槽式Java数组堆栈数据结构中的差异的问题。我回应了,但想知道我的回应是否遗漏了一些东西
PS:我想这个问题对其他人也可能有用
最好的问候
Harry G.T.卡尔
答案 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。
PROS
此模型的优势在于,无论堆栈中有四个,一百个还是一千个项目,都不需要复制任何项目。因此,如果堆栈中有n个项目,则该过程将不是O(n),而是常数O(1)。
PS:以下是关于 数组和堆栈之间作为数据结构的区别:数组仅实现数据结构,但是它是所有变量和构成数据结构的算法的组合。
来源:主要来自
J。 T. Streib和T. Soma,数据结构指南