如果可以对数组执行相同的操作,堆栈的用途是什么?

What is the purpose of stack, if you can do the same operations with an array?

"stack" 在编程中的使用频率如何?换句话说,如果我们用数组替换堆栈,我们会丢失一些东西吗?或者有什么特殊情况堆栈不能被其他任何东西代替吗? 我只是一个 C++ 初学者,我对堆栈的了解就是它们用来存储数据的东西,所以这个主题对我来说似乎不太清楚。 感谢任何信息。

一个"stack"是一种支持先进后出的数据结构的总称。数组是堆栈的一种可能实现。链表也可以实现堆栈。

考虑一个堆栈,它随着更多元素的添加而动态增长,没有预设限制。一个简单的 C 风格数组不能支持这个,因为它在编译时有大小限制。 std::vector 在某些方面像数组一样工作但更复杂,将允许这种动态增长。 (链表也可以,但通常效率较低)。

"First-in, last-out" 对新程序员来说并不总是像对有更多编程经验的人那样具有描述性。堆栈的概念——在这里不是特指 C++(或其他语言)对象——是一个普遍渗透到编程中的概念(这个概念在整个 SO 中都有很好的描述,我相信我会get "incorrect" 是我在这里详细描述的)。

stack data type you discuss and the programming 'thing' that is referred to as a call stack. In computer hardware, there is also a notion of a stack 的设计和行为之间确实存在 link,下面简要讨论。

做调用堆栈有些不公平

调用堆栈,具体来说,就是跟踪程序中的调用。进行的调用越多,在堆栈的 "top" 上添加的调用就越多。调用完成后,它的实例将从堆栈中删除,程序的控制权将返回给调用函数。

所以,我有三个 "functions":ABC

A 呼叫 BB 然后调用 C

堆栈的顺序是:

C
B
A

C 的解析优先于其他(或 "it has control")。在 C 被解决之前,其他人不会完成他们的操作。一旦它被解决,它就会 "popped" 离开堆栈,然后 B 做它需要做的事情。在这里,我们发现了 FILO(先进后出)的概念:A 是第一个调用;但是,它不会解决 - 在这种情况下 - 直到其他人完成。

Wikipedia 对调用堆栈有很好的描述,还有一张很棒的图片(没有阅读文章,图片没有太大帮助,请参见下图进行讨论):

出于我们非常高层次的目的,这张图片向我们展示了关于堆栈概念的一件重要事情,总体而言:它被设想为一系列 元素 (在此案例程序位置 - 黄色条)堆叠 一个在另一个之上。访问调用堆栈的工作方式如上所述:将立即需要的内容添加到顶部,并在不再需要时将其删除。

一叠卡片或一叠盘子经常被用来比喻一叠的行为。

Stack Overflow 问题的这个 answer 对堆栈进行了很好的解释。

对硬件栈的平等对待

你最好在其他地方阅读有关硬件堆栈的信息;然而,根据我的理解,它的执行类似于上面的调用堆栈,但使用的是数据而不是过程。不幸的是,我还不够了解硬件堆栈和调用堆栈之间的区别。但是,无论如何,FILO 的概念仍然适用。

为什么堆栈很重要?

对象抽象的目的是为了更好地模拟栈的操作。事实上,如果我的理解是正确的,stack 被提议作为控制过程调用的方式并且通常是 implemented 在 "architecture level" 用于内存管理。

堆栈数据类型抽象迫使程序员以模仿(或者是调用堆栈和硬件堆栈的根)的方式与抽象交互。我们当然可以用数组来做到这一点,但是堆栈使我们能够轻松地做到这一点。

此答案假定您对 C++ STL stack<>vector<> 模板之间的区别感兴趣 类。
堆栈提供矢量功能的子集。这意味着堆栈实现比矢量实现具有更多自由度。
堆栈保证:

  • 定时推送
  • 恒定时间弹出

但是除了上述之外还有一个vector保证:

  • 带索引的恒定时间随机访问

要提供对索引的恒定时间随机访问,所有元素必须连续存储,而堆栈则不需要。当大小超过容量时,必须重新分配和复制向量,但堆栈不需要。因此,堆栈可以用链表实现,但矢量不能,因为有额外的要求。

In other words, would we loose something if we replace a stack with an array?

是的,我们会在实施中失去一些自由度。