【问题标题】:What are stacks used for? Why are they in C++?栈是做什么用的?为什么它们在 C++ 中?
【发布时间】:2012-01-24 14:19:23
【问题描述】:

我一直在用 Practical C++ Programming 这本书来回顾 C++,并且遇到了这些叫做 Stacks 的东西。书中定义,定义为存储数据的算法。

根据我在书中看到的,它看起来很像汇编……我还记得读过一些关于 16 位的东西。

所以我的问题是:堆栈的用途是什么,它们是否仍然有用,或者它是一种旧方法,可以用 32/64 位计算机更简单有效地完成某些事情?我只是对堆栈的用途感到困惑。


编辑:由于我的问题很模糊,我将重新表述它......什么是堆栈,何时应该使用它。

【问题讨论】:

  • 这是一种数据结构,不是算法。
  • 这和16/32/64位无关,当你需要某种数据结构的时候,你需要它,不管你有多少位。
  • 为什么这会受到反对票的攻击...
  • @Gabe 可能是因为当程序员声称不知道堆栈是什么时,每个人都认为这是在拖钓。
  • @Gabe:否决按钮还提到“没有显示任何研究工作”,这可能是另一个原因。

标签: c++ stack


【解决方案1】:

堆栈不是一种方法,而是一种数据结构,后进先出 (LIFO)。

在 C++ 中,std::stack<> 是一个类模板,其数据可以是任何类型。在许多情况下,后进先出正是您所需要的。

一个示例是虚拟机或解释器,它们利用堆栈架构在函数/过程执行期间保存运行状态。考虑以下语言的解释器,其中子过程可能不会改变调用者的状态:

std::stack<RunState> state;
Instruction i = fetch();

switch (i.type()) {
case Instruction.Call:
    state.push (state.top());
    break;
case Instruction.Return:
    state.pop();
    break;
...
}

维基百科有more examples 用于堆栈数据结构的使用。使用堆栈可以相对轻松地解决一些排序问题。

与所有数据结构一样,C++ 也有很多数据结构(listsqueuessetsmaps (a.k.a. associative arrays, a.k.a. dictionaries)arrays/vectors 等),您现在可能不需要它们,也可能不需要即使在 2 年内,但您应该了解它们、它们的特性、优点、缺点以及何时使用它们。

【讨论】:

    【解决方案2】:

    取决于你说的是哪个堆栈。

    第一个是内存中的存储位置。

    堆栈是一种后进先出的数据结构,无论是 16/32/64 位计算机,它仍然非常有用。

    正如其他人所说,调用堆栈(或“堆栈”)是实际堆栈的一个示例。

    【讨论】:

    • 调用栈也是先进后出的。所以它不是一种不同的堆栈——它只是堆栈的一个例子。
    • 我是个混蛋,但是一个声称有 C 经验的近 10 万贡献者应该知道“内存堆栈”是堆栈的应用程序。
    • @phresnel - 我同意。我愿意。措辞极差的答案试图表明 OP 可能一直在阅读有关数据结构本身或其应用程序的信息。因此重新措辞。很抱歉造成混乱。
    • @JustinNiessner:但也许我太蠢了。也许您的意思是“想要解释调用堆栈或想要解释堆栈数据结构”。对不起,如果我太冒犯了。
    【解决方案3】:

    基本上,当您需要以 LIFO(后进先出)方式存储数据时使用它们。您可以找到信息here。 在 16/32/64/whatever bits 架构上工作与堆栈原理无关。

    【讨论】:

      【解决方案4】:

      在标准 LIFO 逻辑的情况下,您可以使用堆栈。有很多问题需要 LIFO 逻辑。

      【讨论】:

        猜你喜欢
        • 2016-10-24
        • 2013-02-08
        • 1970-01-01
        • 2020-08-24
        • 1970-01-01
        • 1970-01-01
        • 2021-05-29
        • 1970-01-01
        • 2018-01-07
        相关资源
        最近更新 更多