堆栈和队列之间的基本区别是什么?


130

堆栈和队列之间的基本区别是什么?

请帮助我,我找不到区别。

如何区分堆栈和队列?

我在各个链接中搜索了答案,然后找到了答案。

在高级编程中

堆栈定义为元素的列表或序列,可通过在现有元素的“顶部”放置新元素来加长,并通过从现有元素的顶部删除元素来缩短。它是一种ADT [Abstract Data Type],其数学运算为“ push”和“ pop”。

队列是一系列元素,可以通过将新元素放置在现有元素的后面来添加元素,并通过移除队列前面的元素来缩短元素。它是ADT [抽象数据类型]。这些术语在Java,C ++,Python等的编程中还有更多理解。

我可以得到更详细的答案吗?请帮我。


12
您似乎已经回答了自己的问题-堆栈是先进先出(LIFO)容器,而队列是先进先出(FIFO)容器。

Answers:


151

堆栈是一种LIFO(后进先出)数据结构。Wikipedia的相关链接包含详细的描述和示例。

队列是FIFO(先进先出)数据结构。Wikipedia的相关链接包含详细的描述和示例。


131

想象一叠纸。放入堆栈的最后一块在顶部,因此它是第一个出来的。这是LIFO。添加一张纸称为“推动”,而取出一张纸称为“弹出”。

想象在商店里排队。排队的第一个人是第一个离开排队的人。这是FIFO。排队的人“入队”,排队的人“出队”。


3
我能想到的最好的类比之一。
Yeikel

83

视觉模型

薄煎饼 (LIFO)

添加一个和/或删除一个的唯一方法是从顶部开始。

薄煎饼堆栈

线路 队列(FIFO)

当一个人到达时,他们到达队列的末端,当一个人离开时,他们从队列的前面离开。

dvv线

有趣的事实:英国人将排队的人称为队列


6
吉,这一定是imo的答案。感谢@Jacksonkr
库拉桑加

哈哈,很确定这是对Queue和Stack的完美描述,但是仅出于论证的目的,如果我想将第一个煎饼加到盘子里怎么办?我知道可以用stack.size()与if(!stack.isEmpty())来完成,但是仍然可以用第一个薄煎饼是最好的:)...不管怎样,好的答案,我同意这是最清晰的...似乎很有趣,尽管英国人将行称为“队列”(如果准确的话),但在非编程语言中,我仍然会认为第一个条目首先离开的行(退出行/队列后) )
ViaTech'Apr 11'18

等等,他们在别处不叫队列吗?
短途

37

您可以将它们视为事物的有序列表(按它们添加到列表的时间排序)。两者之间的主要区别在于新元素如何进入列表,旧元素如何离开列表。

对于堆栈,如果我有一个列表a, b, c,然后添加d,最后将其添加到表中,因此最终得到a,b,c,d。如果要弹出列表的元素,请删除添加的最后一个元素d。弹出后,我的清单a,b,c又回来了

对于队列,我以相同的方式添加新元素。添加后a,b,c变为。但是,现在弹出时,我必须从列表的最前面获取一个元素,因此它变为。a,b,c,ddb,c,d

非常简单!


14

队列

队列是项目的有序集合。

项目在队列的称为“前端”的一端被删除。

将项目插入到队列的称为“后方”的另一端。

插入的第一个项目是第一个要删除的项目(FIFO)。

叠放

堆栈是项目的集合。

它仅允许访问一个数据项:最后插入的数据项。

在称为“堆栈顶部”的一端插入和删除项目。

它是一个动态且不断变化的对象。

所有数据项都放在堆栈的顶部,并从顶部移出

这种访问结构称为后进先出结构(LIFO)


因此,基本上“队列”是“ FIFO”-先进先出队列。“堆栈”是“ LIFO”时-后进先出队列。我对么?
塞巴斯蒂安·尼尔森

@SebastianNielsen是的,答案中的正确答案。
Dissanayake

但是,链表和堆栈之间有什么区别?是不是一样
塞巴斯蒂安·尼尔森

@SebastianNielsen堆栈是一个ADT,这意味着它公开了一个接口,这是推入和弹出操作,但是对最终用户隐藏了底层机制(实现)。堆栈可以用数组或链表实现。
痢疾

13

堆栈:

  1. 堆栈被定义为元素列表,我们只能在堆栈顶部插入或删除元素。
  2. 堆栈的行为类似于后进先出(LIFO)系统。
  3. 堆栈用于在函数之间传递参数。调用函数时,参数和局部变量存储在堆栈中。
  4. 提供递归支持的高级编程语言(例如Pascal,c等)将堆栈用于簿记。请记住,在每个递归调用中,都需要保存参数的当前值,局部变量和返回地址(调用后控件必须返回的地址)。

队列:

  1. 队列是相同类型元素的集合。它是一个线性列表,其中插入可以发生在列表的一端(称为列表的后面),而删除只能发生在另一端(称为列表的最前面)
  2. 队列的行为类似于先进先出(FIFO)系统。

我非常确定您也可以在堆栈的末尾或起始处插入,我认为这里要注意的重要事项是FIFO vs. LIFO
Mike

6

堆栈是元素的集合,可以一次存储和检索一个元素。以与存储时间相反的顺序检索元素,即,存储的最新元素是要检索的下一个元素。堆栈有时被称为后进先出(LIFO)或先进先出(FILO)结构。在检索到最新元素(通常称为“ top”元素)之前,无法检索以前存储的元素。

队列是元素的集合,可以一次存储和检索一个元素。元素按照其存储时间进行检索,即,存储的第一个元素是要检索的下一个元素。队列有时被称为先进先出(FIFO)或后进后出(LILO)结构。在第一个元素(通常称为“前”元素)被检索之前,无法检索随后存储的元素。


2

堆栈:堆栈被定义为元素列表,我们只能在堆栈顶部插入或删除元素

堆栈用于在函数之间传递参数。调用函数时,参数和局部变量存储在堆栈中。

堆栈是元素的集合,可以一次存储和检索一个元素。以与存储时间相反的顺序检索元素,即,存储的最新元素是要检索的下一个元素。堆栈有时被称为后进先出(LIFO)或先进先出(FILO)结构。在检索到最新元素(通常称为“ top”元素)之前,无法检索以前存储的元素。

队列:

队列是相同类型元素的集合。它是一个线性列表,其中插入可以发生在列表的一端(称为列表的后面),而删除只能发生在另一端(称为列表的最前面)

队列是元素的集合,可以一次存储和检索一个元素。元素按照其存储时间进行检索,即,存储的第一个元素是要检索的下一个元素。队列有时被称为先进先出(FIFO)或后进后出(LILO)结构。在第一个元素(通常称为“前”元素)被检索之前,无法检索随后存储的元素。


2

为了尝试简化堆栈和队列的描述,它们都是信息元素的动态链,可以从链的一端进行访问,它们之间的唯一真正区别是:

使用堆栈时

  • 您在链的一端插入元素,然后
  • 您从链的同一端检索和/或删除元素

排队时

  • 您在链的一端插入元素,然后
  • 您从另一端检索/删除它们

注意:在这种情况下,我使用的是“检索/删除”的抽象措词,因为在某些情况下,您只是从链中检索元素,或者在某种意义上只是读取或访问其值,但是在某些情况下,您从链中删除了元素最后,在某些情况下,您使用同一调用执行两个操作。

同样,有意使用单词元素是为了尽可能抽象出虚构的链,并将其与特定的编程语言术语分离。取决于语言,这个称为元素的抽象信息实体可以是任何东西,例如指针,值,字符串或字符,对象等等。

在大多数情况下,尽管它实际上是一个值或一个存储位置(即指针)。其余的只是将这个事实隐藏在语言行话中<

当元素的顺序很重要并且需要与元素首次进入程序时完全相同时,队列可能会有所帮助。例如,当您处理音频流或缓冲网络数据时。或者,当您执行任何类型的存储和转发处理时。在所有这些情况下,您都需要按照与进入程序时相同的顺序输出元素的顺序,否则信息可能就失去意义了。因此,您可以将程序分解为一部分,该部分从某些输入读取数据,进行一些处理,然后将其写入队列中,而从队列中检索数据的一部分将对其进行处理,然后将其存储在另一个队列中,以进行进一步处理或传输数据。 。

当您需要临时存储将在程序的立即步骤中使用的元素时,堆栈可能会有所帮助。例如,编程语言通常使用堆栈结构将变量传递给函数。他们实际上所做的是将函数参数存储(或推入)堆栈中,然后跳转到函数中,从堆栈中删除并检索(或弹出)相同数量的元素。这样,堆栈的大小取决于函数的嵌套调用数。另外,在调用一个函数并完成其工作之后,它会将堆栈保持与调用之前完全相同的状态!这样,任何功能都可以在堆栈中运行,而忽略其他功能如何运行。

最后,您应该知道,还有其他术语用于类似概念的相同术语。例如,堆栈可以称为堆。这些概念也有混合版本,例如双端队列可以同时作为堆栈和队列运行,因为两端可以同时访问它。此外,数据结构以堆栈或队列的形式提供给您的事实并不一定意味着它是照此实现的,在某些情况下,数据结构可以实现为任何形式并可以作为特定形式提供数据结构仅仅是因为它可以使其表现得像这样。换句话说,如果您为任何数据结构提供推入和弹出方法,它们就会神奇地变成堆栈!


不要对非代码文本使用代码格式。
罗恩侯爵,

1

堆栈是后进先出(后进先出)列表。意味着假设有3个元素插入堆栈,即10、20、30。首先插入10,最后插入30,因此首先从堆栈中删除30,最后从堆栈中删除10。这是LIFO列表(后进先出)。

QUEUE是FIFO列表(先进先出)。意味着首先插入一个元素,该元素首先被删除,例如,人队列。


1

堆叠视为垂直集合。首先了解一个集合是一个对象,它收集并组织其他较小的对象。这些较小的对象通常称为元素。这些元素按照ABC顺序“推入”堆栈,其中A在前,C在后。垂直看起来像这样:添加了第3个元素)C添加了第2个元素)B添加了第1个元素)A

请注意,最先添加到堆栈中的“ A”在底部。如果要从堆栈中删除“ A”,则首先必须删除“ C”,然后是“ B”,最后是目标元素“ A”。在处理堆栈的复杂性时,堆栈需要使用LIFO方法。(后进先出)从堆栈中删除元素时,会弹出正确的语法。我们不会从堆栈中删除元素,而是将其“弹出”。

回想一下,“ A”是推入堆栈的第一个元素,而“ C”是推入堆栈的最后一个元素。如果您决定要查看堆栈底部的内容,即堆栈上有3个元素,则A是第一个B,第二个是C,C是第三个元素,那么必须弹出顶部添加第二个元素以查看堆栈的底部。


请格式化您的问题,使其看起来更好并且更具可读性。
Neeku 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.