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

140

堆栈(Stack)和队列(Queue)的基本区别是什么?

请帮帮我,我无法找到区别。

如何区分堆栈和队列?

我在各种链接中搜索答案,找到了下面的解释:

在高级编程中,

堆栈被定义为一个元素列表或序列,通过在现有元素“顶部”放置新元素来扩展长度,并通过从现有元素的顶部移除元素来缩短长度。它是一种ADT[抽象数据类型],具有数学操作“push”和“pop”。

队列是一个元素序列,通过在现有元素的末尾放置新元素来增加长度,并通过从队列前面移除元素来缩短长度。它是一种ADT[抽象数据类型]。在Java、C++、Python等编程语言中,这些术语还有更多含义。

能否给我提供更详细的答案?请帮助我。


12
你似乎已经回答了自己的问题——栈是一个后进先出(Last-In First-Out,LIFO)的容器,而队列是一个先进先出(First-In First-Out,FIFO)的容器。 - Iridium
12个回答

162

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

队列 是一种先进先出(FIFO)的数据结构。与维基百科相关的链接包含详细的描述和示例。


160

想象一下一个纸张堆栈。最后放入堆栈的纸张在顶部,因此它是第一个出来的。这被称为LIFO。添加一张纸被称为"pushing",移除一张纸被称为"popping"。

想象一下商店里的排队队列。排在最前面的人是第一个出队列的人。这被称为FIFO。进入队列的人被称为"enqueued",离开队列的人被称为"dequeued"。


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

99

一个可视化模型

煎饼(后进先出)

唯一的添加和/或移除方法是从顶部进行。

pancake stack

排队队列(先进先出)

当有人到达时,他们会到达队列的末尾,当有人离开时,他们会从队列的前端离开。

dmv line

有趣的事实:英国人把人群排成一列称为队列


哈哈,这确实是队列和栈的完美描述,但是就争论而言,如果我想要第一个加入盘子的煎饼怎么办?我知道可以通过 stack.size() vs. if(!stack.isEmpty()) 来完成,但是第一个煎饼可能是最好的 :)... 无论如何,回答很好,我同意这是最清晰的...有趣的是,如果英国人把线称为队列(如果这是准确的话),在非编程语言中,我仍然认为那是一条线,第一个进入的人先离开(在离开线/队列后)。 - ViaTech
1
等等,它们在其他地方不叫队列吗? - jaunt

38
你可以将两者都看作是按照添加时间排序的东西列表。两者之间的主要区别在于新元素进入列表和旧元素离开列表的方式。
对于栈,如果我有一个列表a, b, c,然后添加d,它会被放在末尾,因此我最终得到了a, b, c, d。如果我想弹出列表中的一个元素,我删除我添加的最后一个元素,即d。弹出后,我的列表又变成了a, b, c。
对于队列,我同样以相同的方式添加新元素。在添加d之后,a, b, c变成了a, b, c, d。但是,现在当我弹出元素时,我必须从列表的前面取一个元素,所以它变成了b, c, d。
这很简单!

14

队列

队列是一种有序的项目集合。

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

项目在另一端插入,称为“队列后端”。

第一个插入的项目是第一个被移除的项目(先进先出)。

栈是一组项目。

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

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

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

所有的数据项都被放在栈的顶部并从顶部取出。

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


所以基本上,'queue'是“FIFO” - 先进先出队列。而'stack'是“LIFO” - 后进先出队列。我说得对吗? - Sebastian Nielsen
@SebastianNielsen 是的,就像答案中提到的那样。 - Dis_Pro
那么链表和栈有什么区别呢?它们不是一样的吗? - Sebastian Nielsen
@SebastianNielsen 栈是一种抽象数据类型,它公开了一个接口,即推入和弹出操作,但底层机制(实现)对最终用户隐藏。栈可以使用数组或链表实现。 - gdyrrahitis

13

堆栈:

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

队列:

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

我非常确定你也可以在栈的末尾或开头插入元素,我认为这里需要注意的重要事项是FIFO与LIFO。 - Mike

7
一个栈是一组元素,可以逐个存储和检索。元素按照它们的存储时间的相反顺序被检索,即最新存储的元素是下一个要检索的元素。栈有时被称为后进先出(LIFO)或先进后出(FILO)结构。之前存储的元素在最新元素(通常称为“顶部”元素)被检索之前不能被检索。
队列是一组元素,可以逐个存储和检索。元素按照它们的存储时间顺序被检索,即第一个存储的元素是下一个要检索的元素。队列有时被称为先进先出(FIFO)或后进后出(LILO)结构。随后存储的元素在第一个元素(通常称为“前面”元素)被检索之前不能被检索。

2

栈(Stack):

栈被定义为一个元素列表,在该列表中,我们只能在栈顶插入或删除元素。

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

栈是一个集合,可以逐个存储和检索元素。元素按照它们存储的时间相反的顺序检索,即最新存储的元素是下一个要检索的元素。栈有时被称为后进先出 (LIFO) 或先进后出 (FILO) 结构。之前存储的元素在最新元素(通常称为“顶部”元素)被检索之前不能被检索。

队列(Queue):

队列是一组相同类型的元素。它是一个线性列表,在该列表的一端(称为列表的后面)可以进行插入,在另一端(称为列表的前面)只能进行删除。

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


2
为了简化对栈和队列的描述,它们都是动态信息元素链,可以从链的一端访问。它们之间唯一的区别是:
当使用栈时,
- 在链的一端插入元素 - 从同一端检索或删除元素
而在使用队列时,
- 在链的一端插入元素 - 从另一端检索或删除它们
注意:在此上下文中,我使用“检索/删除”这个抽象词汇,因为有时你只需从链中检索元素或者只是访问它的值,但也有时你需要从链中删除元素,最后有时一个操作就可以同时完成这两个动作。
此外,“元素”这个词被故意使用,以尽可能抽象地表示想象中的链,并将其与特定的编程语言术语解耦。这个抽象的信息实体称为元素,可以是任何东西,从指针、值、字符串或字符到对象等,具体取决于所使用的语言。
在大多数情况下,它实际上是一个值或内存位置(即指针)。其他术语只是将这个事实隐藏在语言术语背后。
当元素的顺序很重要并且需要与元素首次进入程序时完全相同时,队列非常有用。例如,当处理音频流或缓冲网络数据时,或者在进行任何类型的存储和转发处理时。在所有这些情况下,你需要元素的顺序以与它们进入程序时相同的顺序输出,否则信息可能会失去意义。因此,可以将程序分为从某个输入读取数据、对其进行处理并将其写入队列的部分,以及从队列检索数据并对其进行处理,然后将其存储在另一个队列中以供进一步处理或传输数据的部分。
当需要暂时存储即将用于程序的立即步骤的元素时,栈非常有用。例如,编程语言通常使用堆栈结构向函数传递变量。它们实际上是将函数参数存储(或推送)到堆栈中,然后跳转到函数,从堆栈中删除和检索(或弹出)相同数量的元素。这样,堆栈的大小取决于函数调用的嵌套次数。此外,在函数被调用并完成其任务后,它会将堆栈留在完全相同的状态,就好像在调用之前一样!这样,任何函数都可以操作堆栈,而不必考虑其他函数如何操作堆栈。
最后,您应该知道,在同一或类似概念上有其他用于这些术语的术语。例如,一个stack(栈)可能被称为heap(堆)。此外,还存在这些概念的混合版本,例如双端队列可以同时作为stack(栈)和queue(队列)使用,因为它可以通过两端同时访问。此外,提供给您的数据结构作为stack(栈)或queue(队列)并不一定意味着它是以这种方式实现的。在某些情况下,数据结构可以被实现为任何内容,并被提供为特定的数据结构,仅仅因为它能够表现得像那样。换句话说,如果您向任何数据结构提供push和pop方法,它们就会神奇地变成stacks(栈)!

不要对非代码文本使用代码格式。 - user207421

1

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接