【问题标题】:Stack and Queues: Which is simpler to implement using arrays?堆栈和队列:使用数组实现哪个更简单?
【发布时间】:2016-06-22 06:00:23
【问题描述】:

我刚刚从教科书练习中得到了这个问题

“堆栈和队列 ADT 可以使用数组来实现。使用数组来实现哪个更简单?解释一下”

我认为首先使用数组可能不是实现堆栈和队列的最佳方式,因为数组中的空间是固定的,除非在每次溢出后调整它的大小。

我对此没有一个完美的回应,但其中哪一个更容易使用数组来实现?

【问题讨论】:

  • 你说得对,数组并不完美,但你可以做到。考虑一下您需要跟踪堆栈和队列的内容。一个比另一个复杂度低...
  • 你说得很好。他们的复杂性。 @John3136
  • 另一方面,他们的方法不是都有 O(1) 时间复杂度吗? @John3136
  • 不是时间复杂度。我在想@kusalananda 在他的回答中提出的思路。我只是想让你考虑一下,而不是给你答案。
  • 我想说队列用数组实现起来更复杂,因为我已经在项目中实现了两个 ADT,虽然它们的时间复杂度为 O(1),但与维护队列相比,维护队列有很多代码堆栈@John3136

标签: data-structures stack queue


【解决方案1】:

我能想到的唯一区别是,使用 stack,您只需跟踪数组中堆栈的前端,而使用 queue 您将需要跟踪队列的前端和后端。

“跟踪”意味着“存储数组索引/偏移量”。

除此之外,堆栈和队列的标准操作在数量上非常相似; push()pop() 用于堆栈,enqueue()dequeue() 用于队列,这两种数据类型都不是特别复杂或难以实现。

【讨论】:

    【解决方案2】:

    与队列相比,堆栈会更好地实现为数组,主要是因为操作类型如何影响数组本身。

    队列

    对于队列数据结构,您需要能够从一端移除元素并将元素推送到另一端。当您有一个数组时,从数组的前面添加或删除一个元素相对不好,因为它涉及到您必须移动所有其他元素以适应新元素。

    queue:    [2, 3, 4, 5, 6]
    enqueue:  1
    queue:    [1, 2, 3, 4, 5, 6] (every element had to shift to fit 1 in the front)
    

    或者如果你的队列方向相反,

    queue:    [1, 2, 3, 4, 5, 6]
    dequeue:  1
    queue:    [2, 3, 4, 5, 6] (every element had to shift when 1 was removed from the front)
    

    因此,无论您将队列定向到哪个方向,您总会有一些操作(入队或出队),其中涉及从数组前面添加/删除一个元素,这反过来又会导致所有其他元素相对移动效率低下(最好避免,这也是为什么大多数队列不使用数组实现的原因)。

    堆栈

    使用堆栈数据结构,您只需要从同一端添加和删除元素。这使我们可以避免在数组前面添加/删除元素时遇到的问题。我们只需要定位我们的堆栈以从数组后面添加和删除元素,并且我们不会遇到在添加或删除某些内容时必须移动所有元素的问题。

    stack:  [1, 2, 3, 4]
    push:   5
    stack:  [1, 2, 3, 4, 5] (nothing had to be shifted)
    pop:
    stack:  [1, 2, 3, 4] (nothing had to be shifted)
    

    【讨论】:

    • 其实在数组中实现一个队列还是比较简单的,而且不用付出移动项的代价。您只需保留头和尾指针,并将数组视为circular buffer。这比在数组中实现堆栈要复杂一点,但并不可怕。
    【解决方案3】:

    是的,对于现实生活中的问题,数组显然不是在数据结构中实现队列或堆栈的最佳选择。

    我认为,堆栈的实现总是比队列的实现更容易,因为在堆栈中我们只需要将元素压入最高索引并从同一索引弹出相同的元素。如果我们想要推送另一个元素,我们会将它推送到同一个索引上。每个操作都在同一个索引上执行。

    但是在队列的情况下,有两个索引可以跟踪,我们必须从中将元素出列,另一个索引用于操作入队。
    我们必须更新它们相应操作的索引(即在 deque 时为 front,在 enqueue 时为 end)。

    【讨论】:

      猜你喜欢
      • 2014-12-23
      • 2010-10-15
      • 1970-01-01
      • 2021-07-08
      • 2015-05-15
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      相关资源
      最近更新 更多