堆栈和队列,为什么?

时间:2010-01-15 21:41:24

标签: data-structures stack queue

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

14 个答案:

答案 0 :(得分:51)

你去过一家自助餐厅,对吗?看到一堆盘子?当将干净的板添加到堆叠中时,将其放在顶部。当移除板时,将其从顶部移除。所以它被称为后进先出(LIFO)。计算机堆栈就是这样,除了它包含数字,如果你愿意,你可以从数组或列表中创建一个。 (如果一叠盘子下方有一个弹簧,他们会说你“推”一个弹簧在顶部,当你移开一个弹簧时,你会“弹出”它。这就是那些词来自的地方。)

在自助餐厅,回去,洗碗的地方。它们有一条传送带,它们将板材放在一端进行清洗,然后它们以相同的顺序从另一端出来。这是一个队列或先进先出(FIFO)。如果您愿意,也可以从数组或列表中创建其中一个。

它们有什么用?好吧,假设你有一个树数据结构(它就像一个真正的木头,除了它是颠倒的),你想写一个程序完全走过它,以便打印出所有的叶子。

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

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

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

答案 1 :(得分:39)

因为它们以比数组和列表更特殊的方式帮助管理数据。

队列是先进先出(FIFO)

Stack是最后一次出局(LIFO)

数组和列表是随机访问。它们非常灵活,也容易腐败。如果您想将数据作为FIFO或LIFO进行管理,最好使用那些已经实现的集合。

答案 2 :(得分:15)

  1. 如果您希望按照放入的顺序排除内容,请使用队列。
  2. 如果您希望以相反的顺序排除内容,请使用堆栈。
  3. 当您想要获取任何内容时,请使用列表,无论您何时将其放入(以及何时不希望它们被自动删除)。

答案 3 :(得分:8)

如果要在数据结构上强制使用某种使用模式。这意味着当你调试问题时,你不必怀疑是否有人将一个元素随机插入到列表中间,弄乱了一些不变量。

答案 4 :(得分:6)

除了其他人已经提到的使用强制执行外,还存在性能问题。如果要从数组或List(ArrayList)的开头删除某些内容,通常需要O(n)时间,但对于队列,则需要O(1)时间。如果有很多元素,这会产生巨大的差异。

答案 5 :(得分:5)

数组/列表和堆栈/队列不是互斥的概念。事实上,您找到的任何堆栈或队列实现几乎肯定都在使用数组或列表。

数组和列表结构提供了数据存储方式的描述,并保证了结构上基本操作的复杂性。

堆栈和队列提供了有关如何插入或删除元素的高级描述。队列的FIFO,堆栈的FILO。

例如。如果要实现消息队列,则将使用队列。但是队列本身可以将每个消息存储在列表中。 “推送”添加到列表前面的消息,“弹出”从列表末尾开始的消息。

答案 6 :(得分:3)

这是一个意图问题。堆栈和队列通常使用数组和列表实现,但更严格地定义元素的添加和删除。

答案 7 :(得分:2)

堆栈和队列是处理数组本身的集合的更高级方法,它不会以元素在集合内的行为方式建立任何顺序。

堆栈(LIFO - 后进先出)和队列(FIFO - 先进先出)建立和排序元素在集合中插入和删除的顺序。

您可以使用Array或Linked List作为存储结构来实现Stack或Queue模式。甚至可以使用这些基本结构创建更复杂的模式,如二进制树或优先级队列,这不仅可以带来插入和删除元素的顺序,还可以在集合中对它们进行排序。

答案 8 :(得分:1)

堆栈或队列是逻辑数据结构;它将在具有物理结构的封面下实现(例如列表,数组,树等)

如果您愿意,欢迎您“自己动手”,或者利用已经实现的抽象。

答案 9 :(得分:1)

我认为堆栈和队列都是根据应用需求使用的内存访问概念。另一方面,数组和列表是两种内存访问技术,它们用于实现堆栈(LIFO)和队列(FIFO)概念。

答案 10 :(得分:0)

问题含糊不清,因为您可以使用数组或链接数据结构来表示堆栈或队列的抽象数据类型。

堆栈或队列的链表实现与数组实现之间的区别与任何数组与动态数据结构具有相同的基本权衡。

链接队列/链接堆栈具有灵活的高速插入/删除功能,并且具有合理的实现,但需要比阵列更多的存储空间。插入/删除在阵列的末端是便宜的,直到你的空间不足为止;队列或堆栈的数组实现需要更多工作来调整大小,因为您需要将原始文件复制到更大的结构中(或者出现溢出错误)。

答案 11 :(得分:0)

有些算法更容易用堆栈而不是数组进行概念化,写入和读取。它使控制逻辑和迭代器更少,从而使代码更简洁,因为这些逻辑和迭代器是由数据结构本身预先设定的。

例如,如果使用了堆栈,则可以避免在数组上重复调用要反向弹出的元素,从而避免在数组上进行多余的“反向”调用。

答案 12 :(得分:0)

堆栈

从根本上讲,每当您需要放倒档并在恒定时间内获取元素时,请使用堆栈。 堆栈遵循LIFO,这只是一种数据整理方式。

Appln:

  1. 在记事本中实现撤消操作。
  2. 浏览器后退按钮使用堆栈。

队列:

使用先进先出(FIFO)原则实现队列

Appln:

  1. 在现实生活中,呼叫中心电话系统将使用队列来按顺序呼叫人们,直到服务代表免费为止。 CPU调度,磁盘调度。当多个进程同时需要CPU时,将使用通过Queue数据结构实现的各种CPU调度算法。
  2. 后台打印中
  3. 图中的宽度优先搜索
  4. 实时系统中的中断处理。中断的处理顺序与到达时相同,先到先得。

答案 13 :(得分:0)

堆栈用于基于缓存的应用程序,例如最近打开/使用的应用程序将出现。 队列用于删除/删除数据,例如首先需要删除第一个插入的数据。