【问题标题】:Stacks, queues and linked lists堆栈、队列和链表
【发布时间】:2015-11-16 01:15:07
【问题描述】:

我最近开始学习数据结构,并且刚刚有了自己的linked list 实现。

现在我偶然发现了两个新的数据结构:stackqueue
从我目前了解到的情况来看
stack 是一个 linked list,它只允许从它的尾部插入/移除,
queue 是一个 linked list,它只允许在它的尾部插入和移除从它的头上。

我的问题是:
为什么我要使用这两种数据结构而不是允许从任何地方插入和删除的常规 linked list
还有,为什么将这两种数据结构归类为独立的数据结构,而不是“受限访问链表”?

【问题讨论】:

  • 栈和队列是基本的DS抽象。它们不必使用链表来实现。 stack和queue分别代表了我们日常生活中想要的两个属性FILO和FIFO。

标签: data-structures linked-list stack queue


【解决方案1】:

栈基本上是一种遵循 LIFO(LAST IN FIRST)的数据结构 出去)。队列是遵循先进先出(FIRST IN FIRST OUT)的队列。

一般来说,StacksQueues可以使用ArraysLinked Lists来实现。

您使用Linked List 实现Stack 的原因是当您需要一个涉及LAST IN FIRST OUT 表单的功能并且您不确定该功能需要多少元素时。因此,您将使用LinkedList 根据需求动态创建节点。

Queues 也是如此

两者独立的原因是它们遵循不同的原则,分别是LIFO和FIFO。

【讨论】:

    【解决方案2】:

    堆栈和队列有其存在的理由。 堆栈是可以使用数组、链表或其他形式实现的 FILO(先进后出)或 LIFO(两种方式)数据结构。考虑浏览器历史。您导航到 站点 A -> 然后是 B -> 然后是 C -> D。随着用户向前移动,您首先push(在尾部插入)网站列表。这可确保当前站点始终位于堆栈的顶部。

    然后当用户点击返回按钮时,您 pop 顶部的那个(从尾部移除 - 用于插入的同一端)给出最后访问的站点 - C时间>。因此,First In(即Site A)和Last Out(最后进入的是Site D的概念,而后者又成为第一个退出的)

    对于 FIFO(先进先出)的队列也可以这样说。考虑作业队列的示例。在执行一项工作时,您会(不考虑任何优化算法)为第一个到达的人提供服务。这使得队列成为一种出色的数据结构,可以按照先到先得的原则处理作业。

    在这两种情况下,您都不希望在任何索引处任意删除或插入元素。不,这会导致不良行为。因此,需要堆栈/队列。我要再次强调,堆栈/队列可以通过对链表实施限制来实现。

    抱歉,图像质量很差 - 我只是用颜料画的。

    【讨论】:

    • 很好的例子。我有个问题。 堆栈是一种 FILO(先进后出)或 LIFO(两种方式)数据结构,可以使用数组实现如果队列使用数组实现。推送复杂度会高于链接列表。
    • @AlizainPrasla 基于队列和堆栈的类似实现,推送时间相似。移除一个项目(从开始到结束)需要不同的时间。一些语言(如 JavaScript)有一个内置的方法来从堆栈(pop)和队列(shift)中删除项目。在jsfiddle.net/chechs/b9Lfu2do/15 上创建了一个小提琴,这显示了 Chrome 和 Opera 中这两个操作的巨大时间差异; Firefox 和 Safari 仍然需要更长的时间来转移,但不会那么多。您可以尝试使用 pushpop 来检查推送复杂性。
    【解决方案3】:

    链表是内存中元素之间具有一定关系的数据结构, 而堆栈和队列是具有特定接口和行为的数据结构。堆栈和队列甚至可以在数组中实现,因此它们是遵循一定规则的数据结构,即堆栈的 LIFO 和队列的 FIFO,(它们不仅限于对于链表,它们还可以在其他数据结构(如数组)中实现,重要的是它们遵循的行为和规则)

    【讨论】:

      猜你喜欢
      • 2019-03-07
      • 2015-05-15
      • 2013-09-18
      • 2014-07-21
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      • 2021-03-17
      • 2014-04-21
      相关资源
      最近更新 更多