"堆栈的频率是多少?用于编程?换句话说,如果我们用数组替换堆栈,我们会丢失一些东西吗?或者是否有任何特殊情况,堆栈不能被其他任何东西取代? 我只是一个C ++初学者,而我所知道的堆栈就是他们用来存储数据的东西,所以这个主题对我来说似乎并不清楚。 任何信息都是相关的。
答案 0 :(得分:9)
A"堆栈"是支持先进后出的数据结构的通用名称。数组是堆栈的一种可能实现。链表也可以实现堆栈。
考虑一个堆栈,它会随着添加更多元素而动态增长,没有预设限制。一个简单的C风格的数组无法支持这一点,因为它在编译时的大小有限。 std::vector
在某种程度上像数组一样工作但更复杂,可以实现这种动态增长。 (链表也是如此,但通常效率较低)。
答案 1 :(得分:1)
"先进先出"对于新程序员来说,并不总是像对具有更多编程经验的人那样描述。堆栈的概念 - 在这里,特别是指C ++(或其他语言)对象 - 是一个贯穿编程的概念,一般来说(一个概念在整个SO中得到很好的描述,而且我确信我会得到"不正确"我是非常详细地描述它,这里)。
您所讨论的stack data type的设计与行为与编程事物之间确实存在联系。这被称为call stack。在计算机硬件中,下面还简要讨论了stack的概念。
具体而言,调用堆栈是跟踪程序中的调用的内容。拨打的电话越多,在" top"上添加的电话就越多。堆栈。一旦调用完成,它的实例将从堆栈中删除,并且程序的控制权将返回给调用函数。
所以,我有三个"功能" :A
,B
,C
。
A
来电B
。 B
然后调用C
。
然后堆栈的顺序为:
C
B
A
C
优先于其他人的解决方案(或者,#34;它有控制权")。在C
解决之前,其他人不会完成他们的操作。一旦它得到解决,就可以弹出#34;"离开堆栈,然后B
执行它需要做的事情。在这里,我们发现了FILO(先入,后出)的概念:A
是第一个呼叫;但是,在这种情况下,它没有得到解决,直到其他人完成。
维基百科对调用堆栈及其良好的图像进行了很好的描述(没有阅读文章,图像没有多大帮助,请参阅下面的图片进行讨论):
对于我们非常高级的目的,这个图像向我们展示了一个关于堆栈概念的重要事项:它被设想为一系列元素(在这种情况下是程序位置 - 黄色条)堆叠一个在另一个上面。访问调用堆栈的工作原理如上所述:立即添加了什么,并在不再需要时删除。
堆栈的牌或一叠牌通常用作描述堆栈行为的类比。
Stack Overflow问题的answer给出了堆栈的一个很好的解释。
你最好在其他地方阅读有关硬件堆栈的内容;但是,根据我的理解,它的执行方式与上面的调用堆栈类似,但是使用数据而不是过程。不幸的是,我还不太了解硬件堆栈和调用堆栈。但是,无论如何,FILO的概念仍然适用。
堆栈对象抽象的目的是更好地模仿堆栈的操作。事实上,如果我的理解是正确的,stack
被提议作为控制程序调用的方式,而且通常是implemented在"架构级别"用于内存管理。
堆栈数据类型抽象迫使程序员以模仿 - 或者是调用堆栈和硬件堆栈的根本 - 的方式与抽象交互。我们当然可以用数组做到这一点,但是堆栈让我们能够轻松完成。
答案 2 :(得分:1)
此答案假设您对C ++ STL stack<>
和vector<>
模板类之间的差异感兴趣。
堆栈提供向量功能的子集。这意味着堆栈实现比矢量实现具有更多的自由度
堆栈保证:
但除了上述内容之外,矢量还可以保证:
要使用索引提供恒定时间随机访问,必须连续存储所有元素,这对于堆栈不是必需的。当大小超过容量时,必须重新分配和复制向量,但堆栈不需要该向量。因此,堆栈可以用链表实现,但是由于附加要求,矢量不能实现。
换句话说,如果我们用一个替换堆栈,我们会丢失一些东西 阵列
是的,我们会在实施过程中放松一些自由。