【问题标题】:what is the basic difference between stack and queue?堆栈和队列之间的基本区别是什么?
【发布时间】:2012-06-14 01:15:10
【问题描述】:

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

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

如何区分堆栈和队列?

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

在高级编程中,

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

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

我能有一个更详细的答案吗?请帮帮我。

【问题讨论】:

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

标签: stack queue


【解决方案1】:

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

使用队列,它以与排序相同的顺序检索数据。删除时可以访问队列的前面,添加时可以访问队列的后面。这遵循 FIFO(先进先出)系统。

堆栈使用 push、pop、peek、size 和 clear。队列使用 Enqueue、dequeue、peek、size 和 clear。

【讨论】:

    【解决方案2】:

    视觉模型

    煎饼 Stack (LIFO)

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

    Queue (FIFO)

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

    有趣的事实:英国人将一行人称为Queue

    【讨论】:

    • 哈哈,当然这是对队列和堆栈的完美描述,但只是为了争论,如果我想把第一个煎饼加到盘子里怎么办?我知道这可以通过 stack.size() 与 if(!stack.isEmpty()) 来完成,但第一个煎饼可能是最好的:)...无论哪种方式,答案都很好,我同意这是最清晰的......似乎很有趣,英国人将行称为队列(如果这是准确的话),在非编程语言中,我仍然会认为第一个条目首先离开的行(在退出行/队列之后) )
    • 等等,其他地方不叫队列吗?
    【解决方案3】:

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

    想象一下商店里的队列。第一个排队的人是第一个出线的人。这是FIFO。排队的人“入队”,出队的人“出队”。

    【讨论】:

    • 我能想到的最好的类比之一。
    【解决方案4】:

    队列

    队列是项目的有序集合。

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

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

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

    堆栈

    堆栈是项目的集合。

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

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

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

    所有数据项放在栈顶,从栈顶取出

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

    【讨论】:

    • 所以基本上一个“队列”是一个“FIFO”——先进先出队列。而“堆栈”是“LIFO” - 后进先出队列。我说的对吗?
    • @SebastianNielsen 是的,正如答案中提到的那样正确。
    • 但是链表和栈有什么区别呢?不一样吗?
    • @SebastianNielsen 堆栈是一个 ADT,这意味着它公开了一个接口,即 push 和 pop 操作,但底层机制(实现)对最终用户是隐藏的。栈可以用数组实现,也可以用链表实现。
    【解决方案5】:

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

    使用堆栈时

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

    排队时

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

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

    另外,元素一词也是特意使用的,目的是为了尽可能地抽象出想象中的链,并将其与特定的编程语言解耦 条款。这种称为元素的抽象信息实体可以是任何东西,从指针、值、字符串或字符、对象……取决于语言。

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

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

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

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

    【讨论】:

    • 不要对非代码文本使用代码格式。
    【解决方案6】:

    堆叠一个被认为是垂直集合。首先要明白集合是一个集合和组织其他更小的对象的对象。这些较小的对象通常称为元素。这些元素以 A B C 顺序“推送”到堆栈中,其中 A 是第一个,C 是最后一个。垂直它看起来像这样: 添加的第 3 个元素)C 添加的第二个元素)B 添加的第一个元素)A

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

    回想一下,“A”是第一个压入堆栈的元素,“C”是最后一个压入堆栈的元素。如果您决定要查看堆栈底部的内容,因为 3 个元素都在堆栈中,所以 A 是第一个 B 是第二个,C 是第三个元素,顶部必须被弹出然后添加第二个元素以查看堆栈的底部。

    【讨论】:

    • 请格式化您的问题,使其看起来更好、更具可读性。
    【解决方案7】:

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

    QUEUE 是 FIFO 列表(先进先出)。表示先插入一个元素 首先删除。例如人群队列。

    【讨论】:

      【解决方案8】:

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

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

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

      队列:

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

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

      【讨论】:

        【解决方案9】:

        堆栈:

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

        队列:

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

        【讨论】:

        • 我很确定你也可以在堆栈的末尾或开头插入,我认为这里要注意的重要一点是 FIFO 与 LIFO
        【解决方案10】:

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

        对于堆栈,如果我有一个列表 a, b, c,然后添加 d,它会被添加到最后,所以我最终得到 a,b,c,d。如果我想弹出列表中的一个元素,我会删除我添加的最后一个元素,即d。弹出后,我的列表现在又是a,b,c

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

        很简单!

        【讨论】:

          【解决方案11】:

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

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

          【讨论】:

            【解决方案12】:

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

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

            【讨论】:

              猜你喜欢
              • 2012-02-05
              • 2013-08-26
              • 1970-01-01
              • 2013-09-30
              • 1970-01-01
              • 2016-08-18
              • 2021-05-10
              • 2014-01-09
              • 2016-03-03
              相关资源
              最近更新 更多