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

时间:2016-06-22 06:00:24

标签: data-structures stack queue

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

  

"堆栈和队列ADT可以使用数组实现。哪一个使用数组更容易实现?解释"

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

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

3 个答案:

答案 0 :(得分:2)

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

"跟踪"表示"存储"。

的数组索引/偏移量

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

答案 1 :(得分:1)

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

队列

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

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)

答案 2 :(得分:1)

是的,很明显,对于现实生活中的问题,数组不是最好的数据结构中的队列或堆栈。

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

但是在队列的情况下,有两个索引可以跟踪一个我们必须从中取出元素的索引和另一个操作入队的索引。
我们必须更新相应操作的索引(即deque时的前面和入队时的结束)。