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

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

请帮帮我,我找不出区别。

如何区分堆栈和队列?

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

在高级编程中,

堆栈被定义为一个元素列表或序列,通过将新元素放置在现有元素的“顶部”而加长,通过从现有元素的顶部删除元素而缩短。它是一个 ADT [抽象数据类型] ,具有“推”和“弹”的数学操作。

队列是将新元素放在已有元素的后面,通过删除队列前面的元素而缩短的元素序列。它是一个 ADT [抽象数据类型]。在 Java、 C + + 、 Python 等编程中对这些术语有更多的理解。

我可以有一个更详细的答案吗? 请帮助我。

284547 次浏览

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

队列是元素的集合,可以一次存储和检索一个元素。元素是按照它们的存储时间来检索的,也就是说,第一个存储的元素是下一个要检索的元素。队列有时被称为先入先出(FIFO)或后入后出(LILO)结构。在检索到第一个元素(通常称为“ front”元素)之前,无法检索随后存储的元素。

Stack 是一个 LIFO (后进先出)数据结构。

Queue 是一个 FIFO (先进先出)数据结构。

您可以将两者都看作是事物的有序列表(根据它们被添加到列表中的时间进行排序)。两者之间的主要区别在于新元素如何进入列表,而旧元素如何离开列表。

对于一个堆栈,如果我有一个列表 a, b, c,并且我添加了 d,那么它将在最后附加,所以我最终使用 a,b,c,d。如果我想弹出列表中的一个元素,我会删除我添加的最后一个元素,即 d。一声爆响之后,我的列表又变成了 a,b,c

对于队列,我以同样的方式添加新元素。加入 d后,a,b,c变成 a,b,c,d。但是,现在当我弹出时,我必须从列表的前面取出一个元素,这样它就变成了 b,c,d

很简单!

斯塔克:

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

排队:

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

斯塔克: Stack 定义为一个元素列表,我们只能在其中的堆栈顶部插入或删除元素

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

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

排队:

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

队列是元素的集合,可以一次存储和检索一个元素。元素是按照它们的存储时间来检索的,也就是说,第一个存储的元素是下一个要检索的元素。队列有时被称为先入先出(FIFO)或后入后出(LILO)结构。在检索到第一个元素(通常称为“ front”元素)之前,无法检索随后存储的元素。

排队

队列是项的有序集合。

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

项目被插入到队列的另一端,称为“后面”。

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

Stack

堆栈是项的集合。

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

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

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

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

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

STACK 是一个 LIFO (last in,first out)列表。意思是假设在堆栈中插入了3个元素,即10、20、30。 10是首先插入和30是最后插入,所以30是首先删除堆栈和10是最后 这是一个 LIFO 列表(最后进入先出)。

QUEUE 是 FIFO 列表(先进先出)。意思是先插入一个元素 首先被删除的人。

堆叠已考虑的垂直集合。首先要理解的是,集合是一个对象,它收集和组织其他较小的对象。这些较小的对象通常被称为元素。这些元素按照 A 是第一个 C 是最后一个的 ABC 顺序被“推”到堆栈上。纵向看起来是这样的: 增加第三个元素) C 增加第二个元素) B 增加的第一个元素)

请注意,首先添加到堆栈中的“ A”位于底部。 如果你想从堆栈中删除“ A”,你首先必须删除“ C”,然后是“ B”,最后是你的目标元素“ A”。在处理堆栈的复杂性时,堆栈需要后进先出(LIFO)方法。(Last In First Out)当从堆栈中删除元素时,正确的语法是 pop。我们不从堆栈中删除元素,而是“弹出”它。

回想一下,“ A”是推送到堆栈上的第一个元素,“ C”是推送到堆栈上的最后一个元素。如果你决定要看看堆栈底部有什么元素,因为这3个元素在堆栈上排序为: A 是第一个 B 是第二个元素,C 是第三个元素,那么为了查看堆栈底部,必须先弹出顶部,然后添加第二个元素。

想象一下 一叠纸。最后一块放入堆栈的是在顶部,所以它是第一个出来的。这是 LIFO。添加一张纸称为“推”,删除一张纸称为“弹出”。

想象一下 在商店排队。第一个排队的人就是第一个越界的人。这是 FIFO。一个排队的人是“排队的”,一个排队的人是“排队的”。

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

当使用堆栈时

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

而排队的时候

  • 在链的一端插入元素
  • 你从另一端取回/移除它们

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

此外,还有意使用 word 元素来尽可能抽象虚链,并将其与特定的编程语言分离 条款。这个称为 element 的抽象信息实体可以是任何东西,从指针、值、字符串或字符、对象... ... 这取决于语言。

在大多数情况下,虽然它实际上要么是一个值,要么是一个内存位置(比如一个指针)。而其他人只是用语言术语来掩盖这一事实

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

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

最后,你应该知道还有其他术语用于类似的概念。例如,堆栈可以称为堆。这些概念也有混合版本,例如一个双端队列可以同时作为堆栈和队列运行,因为它可以被两端同时访问。此外,将数据结构作为堆栈或队列提供给您的事实并不一定意味着它实现为堆栈或队列,在一些实例中,数据结构可以作为任何东西实现,并且可以作为特定的数据结构提供,只是因为它的行为可以像堆栈或队列那样。换句话说,如果您为任何数据结构提供一个 push 和 pop 方法,它们就会神奇地变成堆栈!

视觉模型

煎饼 Stack (LIFO)

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

pancake stack

线 排队 (FIFO)

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

dmv line

有趣的事实: 英国人把排队的人称为“非推荐者”

简单地说,堆栈是一种数据结构,它以与数据存储顺序相反的顺序检索数据。这意味着插入和删除都遵循后进先出(LIFO)系统。只有可以访问堆栈的顶部。

对于队列,它按照排序的顺序检索数据。您可以在删除时访问队列的前端,在添加时访问队列的后端。这遵循先进先出(FIFO)系统。

堆栈使用推、弹出、查看、大小和清除。队列使用 Enqueue、 dequeue、查看、大小和清除。