Data structures 堆栈和队列:使用数组实现哪个更简单?

Data structures 堆栈和队列:使用数组实现哪个更简单?,data-structures,stack,queue,Data Structures,Stack,Queue,我刚从课本练习中得到这个问题 “堆栈和队列ADT可以使用数组实现。使用数组实现哪一个更简单?解释” 我认为首先使用数组可能不是实现堆栈和队列的最佳方法,因为数组中的空间是固定的,除非在每次项目溢出后调整大小 对此我没有一个完美的答案,但使用数组实现哪一个更简单?我能想到的唯一区别是,对于堆栈,您只需要跟踪数组中堆栈的前端,而对于队列,您需要跟踪队列的前端和端部 “保持跟踪”表示“为存储数组索引/偏移量” 除此之外,堆栈和队列上的标准操作在数量上相当相似push(),pop()用于堆栈,而enqu

我刚从课本练习中得到这个问题

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

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


对此我没有一个完美的答案,但使用数组实现哪一个更简单?

我能想到的唯一区别是,对于堆栈,您只需要跟踪数组中堆栈的前端,而对于队列,您需要跟踪队列的前端和端部

“保持跟踪”表示“为存储数组索引/偏移量”


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

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

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

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)

是的,很明显,对于现实生活中的问题,数组并不是在数据结构中实现队列或堆栈的最佳方法

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

但是在队列的情况下,有两个索引可以跟踪,一个是我们必须从中退出元素的索引,另一个是操作排队的索引。

我们必须为它们相应的操作更新索引(即deque时的front和enqueue时的end)。

你说得对,数组对这两种操作都不是完美的,但你可以做到。考虑一下堆栈和队列需要跟踪的内容。一个比另一个复杂…你有一个很好的观点。他们的复杂性@另一方面,他们的方法不是都有O(1)的时间复杂度吗@约翰3136不是时间复杂性。我在想库萨兰达在回答中所说的话。我只是想让你考虑一下,而不是给你答案。我想说的是,使用数组实现队列更复杂,因为我已经在项目上实现了两个ADT,尽管它们的时间复杂度为O(1)。与stacks@john3136相比,维护队列需要很多代码,在数组中实现队列相对来说比较简单,而且您不必为移动项目付出代价。您只需保留头指针和尾指针,并将数组视为一个数组。这比在数组中实现堆栈稍微复杂一点,但并不可怕。