堆栈如何工作?

时间:2013-03-01 22:56:07

标签: memory-management stack heap-memory

我有几个关于堆栈的问题。关于堆栈我不明白的一件事是“流行”和“推动”的想法。假设我有一个整数a和b,堆栈上面有一个b。要访问b,据我所知,必须从堆栈弹出才能访问b。那么当它从堆栈中弹出时,“a”存储在哪里。

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

4 个答案:

答案 0 :(得分:1)

我不是专家,但您可以像Tower of Hanoi谜一样想到这一点。要访问下部光盘,您可以“弹出”它上面的光盘并将它们放在其他位置 - 在这种情况下,放在其他堆栈上,但在编程的情况下,它可能只是一个简单的变量或指针或任何东西。如果你有你需要的物品,那么其他物品可以放回堆栈或完全转移到其他地方。

答案 1 :(得分:1)

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

想象一下坐在你左边柜台上的一堆脏盘子。你拿一个去洗它(从“脏”堆栈中弹出),洗净,干燥,然后把它放在右边的干净堆栈顶部(推它)。

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

如果你不能用盘子拍照,可以使用真正的扑克牌(或棒球卡,或一叠纸 - 任何你可以整齐地堆放(“堆叠”)的东西)并将它放在你的桌子上左手。然后执行我最后一段中的步骤,将“plate”替换为“card”并实际执行步骤。

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

答案 2 :(得分:1)

  

因此当从堆栈中弹出“a”时,存储在哪里。

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

  

此外,如果堆栈内存比堆内存更有效,那么为什么呢   堆栈内存不像堆栈一样?

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

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

答案 3 :(得分:1)

让我们看看你的情况。

你有一个包含 n 元素的堆栈,最后一个是 a b 就在下面。

pop 操作会返回弹出的值,因此如果您想从 b 的顶部访问第二个值,您可以执行以下操作:

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

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

您似乎更需要一个基于随机索引的访问集合。 该集合可能存储在堆上。希望它澄清堆栈弹出/推动一点。