data-structures - 堆栈和队列,为什么?

标签 data-structures stack queue

为什么以及何时应该使用堆栈或队列数据结构而不是数组/列表?您能否展示一个状态示例,如果您使用堆栈或队列会更好?

最佳答案

你去过自助餐厅吧?看到一堆盘子了吗?当干净的盘子被添加到堆叠中时,它被放在顶部。当移除板时,它是从顶部移除的。所以称为后进先出(LIFO)。计算机堆栈与此类似,只是它保存数字,并且如果您愿意,您可以从数组或列表中创建一个数字。 (如果这堆盘子下面有一个 Spring ,他们会说你将一个盘子“推”到顶部,当你取出一个盘子时,你将它“弹出”。这就是这些词的来源。)

在自助餐厅,进入后面,他们在那里洗碗。他们有一条传送带,将待清洗的盘子放在一端,然后以相同的顺序从另一端出来。这就是队列或先进先出 (FIFO)。如果您愿意,您还可以从数组或列表中创建其中之一。

它们有什么用?好吧,假设你有一个树数据结构(它就像一棵真正的木头树,只是它是颠倒的),并且你想编写一个程序来完全遍历它,以便打印出所有叶子。

一种方法是进行深度优先步行。您从树干开始,转到第一个分支,然后转到该分支的第一个分支,依此类推,直到到达叶子并打印它。但是如何备份才能到达下一个分支呢?好吧,每次你进入一个分支时,你都会在堆栈中“推送”一些信息,当你备份时,你会“弹出”它,这会告诉你接下来要选择哪个分支。这就是您跟踪每个点下一步要执行哪个分支的方式。

另一种方法是广度优先步行。从主干开始,对主干上的所有分支进行编号,并将这些编号放入队列中。然后,您从另一端取出一个号码,转到该分支,对于从它出来的每个分支,您再次对它们进行编号(与第一个连续)并将它们放入队列中。当您继续这样做时,您将首先访问距主干 1 个分支的分支。然后你将访问距离主干 2 个分支的所有分支,依此类推。最终你会到达叶子并可以打印它们。

这是编程中的两个基本概念。

关于data-structures - 堆栈和队列,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2074970/

相关文章:

algorithm - 作为树的高度函数的可能二叉树的数量之间是否存在联系?

algorithm - 合并作为排序数组实现的堆

java - 如果算法使用堆栈找不到具有精确总和的子集,则找到与目标值最接近的子集

java - 按特定顺序合并两个队列的方法

algorithm - 队列中的前 n 个元素

Python多处理: TypeError: 'Queue' object is not iterable

java - 使用特定的对象属性来索引,使用 Map 结构

ruby - 学习编程

c++ - 我需要有关构建 C++ 堆栈模板的帮助。 "StackType<int>::~StackType<int>(void)"错误?

Java Stack peek 方法显示 0 而不是正确的数字