1

我有几个关于堆栈的问题。我不了解堆栈的一件事是“弹出”和“推送”的想法。假设我有整数 a 和 b,堆栈上的 a 高于 b。据我了解,要访问 b,必须将 a 从堆栈中弹出才能访问 b。那么“a”从堆栈中弹出时存储在哪里。

此外,如果堆栈内存比堆内存更有效地访问,为什么堆内存的结构不像堆栈?谢谢。

4

4 回答 4

1

我不是专家,但你可以把它想象成河内塔之谜。要访问较低的磁盘,您可以“弹出”它上面的磁盘并将它们放在其他地方 - 在这种情况下,在其他堆栈上,但在编程的情况下,它可能只是一个简单的变量或指针或任何东西。当你得到你需要的项目时,其他的可以放回堆栈或完全移动到其他地方。

于 2013-03-01T23:00:20.693 回答
1

a存储在您决定存储它的任何位置。:-) 您需要提供一个变量,a当您删除它时将值存储在堆栈顶部(),然后删除下一项(b)并将其存储在不同的变量中以使用它,然后推送第一个值 ( a) 返回堆栈。

想象一下坐在你左边柜台上的一堆脏盘子。你拿起一个来洗它(从“脏”堆里拿出来),洗干净,擦干,然后把它放在你右边干净的堆顶上(推它)。

如果您想从任一堆栈的顶部到达第二个盘子,则必须移动最上面的一个才能到达它。所以你把它捡起来(弹出),暂时放在某个地方,拿起下一个盘子(弹出它)并把它放在某个地方,然后把你取出的第一个放回堆上(把它推回堆栈上)。

如果你不能用盘子来描绘它,请使用一副真正的扑克牌(或棒球卡,或一叠纸——任何你可以整齐堆放(“堆叠”)的东西),然后把它放在你左手的桌子上。然后执行我上一段中的步骤,将单词“plate”替换为“card”并实际执行这些步骤。

所以要访问b,你声明一个要存储的变量a,弹出a并将其保存在该变量中,弹出b到它自己的变量中,然后推a回堆栈。

于 2013-03-01T23:05:58.300 回答
1

那么“a”从堆栈中弹出时存储在哪里。

这取决于。它转到正在读取堆栈的程序决定的地方。它可以存储值,忽略它,打印它,任何东西。

此外,如果堆栈内存比堆内存更有效地访问,为什么堆内存的结构不像堆栈?

访问堆栈并不比访问堆更有效,这取决于使用情况。程序的流程变得越来越深,就像堆栈一样。在主流语言中,局部变量、参数和返回地址存储在堆栈结构中,因为这种结构更容易实现我们所说的函数堆栈帧的语义。一个函数可以非常有效地访问它自己的堆栈帧,但不一定是它的调用函数的堆栈帧,即整个堆栈。

另一方面,如果以这种方式实现堆,它将是低效的,因为希望堆能够访问并可能删除任何地方的项目,而不仅仅是从其顶部/底部。

于 2013-03-01T23:07:28.753 回答
1

让我们以您的案例为例。

你有一个堆栈,上面有n 个元素,最后一个是ab在下面。

pop操作返回弹出的值,所以如果你想访问从顶部开始的第二个b,你可以这样做:

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

但是,堆栈很少会以这种方式使用。它是一个 LIFO 队列,当像 LIFO 队列一样访问时效果最好。

看来您宁愿需要一个基于随机索引访问的集合。该集合可能会存储在堆上。希望它澄清了堆栈弹出/推送。

于 2013-03-01T23:11:17.803 回答