为什么以及何时应该使用堆栈或队列数据结构而不是数组/列表?您能否展示一个状态示例,如果您使用堆栈或队列会更好?
最佳答案
你去过自助餐厅吧?看到一堆盘子了吗?当干净的盘子被添加到堆叠中时,它被放在顶部。当移除板时,它是从顶部移除的。所以称为后进先出(LIFO)。计算机堆栈与此类似,只是它保存数字,并且如果您愿意,您可以从数组或列表中创建一个数字。 (如果这堆盘子下面有一个 Spring ,他们会说你将一个盘子“推”到顶部,当你取出一个盘子时,你将它“弹出”。这就是这些词的来源。)
在自助餐厅,进入后面,他们在那里洗碗。他们有一条传送带,将待清洗的盘子放在一端,然后以相同的顺序从另一端出来。这就是队列或先进先出 (FIFO)。如果您愿意,您还可以从数组或列表中创建其中之一。
它们有什么用?好吧,假设你有一个树数据结构(它就像一棵真正的木头树,只是它是颠倒的),并且你想编写一个程序来完全遍历它,以便打印出所有叶子。
一种方法是进行深度优先步行。您从树干开始,转到第一个分支,然后转到该分支的第一个分支,依此类推,直到到达叶子并打印它。但是如何备份才能到达下一个分支呢?好吧,每次你进入一个分支时,你都会在堆栈中“推送”一些信息,当你备份时,你会“弹出”它,这会告诉你接下来要选择哪个分支。这就是您跟踪每个点下一步要执行哪个分支的方式。
另一种方法是广度优先步行。从主干开始,对主干上的所有分支进行编号,并将这些编号放入队列中。然后,您从另一端取出一个号码,转到该分支,对于从它出来的每个分支,您再次对它们进行编号(与第一个连续)并将它们放入队列中。当您继续这样做时,您将首先访问距主干 1 个分支的分支。然后你将访问距离主干 2 个分支的所有分支,依此类推。最终你会到达叶子并可以打印它们。
这是编程中的两个基本概念。
关于data-structures - 堆栈和队列,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2074970/