数据结构:在这种类型的练习中,pop、push、dequeue和enqueue的解释

5
我正在尝试更加熟悉这4个概念。
所以如果我们有一个数组 {15, 34, 23, 32, 15, 5}
并且我们有如下操作:
pop();
push(30);
enqueue(40);
dequeue(100);
pop() 只会删除第一个数字,也就是15,对吗? 如果是 pop(20) 呢?
我认为 push(30) 会将30添加为最后一个数字。
enqueue 和 dequeue 是否与 push 和 pop 工作方式相同?
那么,enqueue(40) 会在队列的末尾添加40吗?dequeue(100) 会做什么?

你真的想在数组上执行这些操作吗?也许你应该考虑更具体地使用队列/栈? - miracle_the_V
我只是在努力理解这些概念。数组只是一些东西,我可以更清楚地看到演示。 - vexomrs
C++中的数组(如std::array)没有这些操作。push和pop在std::stack中可用,std::stack::pop()返回一个元素并且不带任何参数(不可能使用pop(20)),push将元素放在堆栈顶部而不是末尾。在std库中没有enqueue和dequeue,但是std::vector和std::deque具有特定的操作,这些操作明确说明了元素的放置位置:push_back,pop_front等。只需查阅这些结构的手册即可。 - mariusm
@vexomrs:请不要忘记回来考虑给有用的回答点赞和接受。这对你、试图回答你问题的人以及整个社区都有好处。这就是我们在这里说“谢谢”的方式。 - code_dredd
1个回答

10
pop()只会移除第一个数字,即15,如果是pop(20)呢?
如果你将这些操作与特定的数据结构联系起来,那么理解这些概念可能会更容易。
例如,像push(item)和pop()这样的操作是为堆栈而设计的,而像enqueue(item)和dequeue()这样的操作则是为队列而设计的,两者都有具体且明确定义的行为方式。
堆栈仅使用位于顶部的项,就像一堆煎饼、文件或任何其他收集放置在彼此之上的项目一样。
这意味着你的{15, 34, 23, 32, 15, 5}数组可以看作是这样的:
| 15 |   <--- top
| 34 |
| 23 |
| 32 |
| 15 |
|  5 |
+----+

在这里,pop 只会移除栈顶的元素,然后将top指向下面的一个元素(比如 34)。显然,使用 push(8) 将会在栈的顶部添加一个新元素(比如8),因此它现在看起来是这样的:

|  8 |   <--- top
| 34 |
| 23 |
| 32 |
| 15 |
|  5 |
+----+

由于栈的定义行为,像pop(item)这样的操作是没有意义的:它将不再限制自己在栈顶的项目上。

我假设push(30)会将30添加为最后一个数字。

这是不正确的,或者至少是模糊的:你认为“最后”元素在哪里?对你来说,“最后”是什么意思?问题在于,“第一个”和“最后一个”这样的术语暗示了顺序,这是队列需要处理的事情(稍后会讲到)。然而,栈并不是按照这种意义上的有序集合,因此在栈的上下文中谈论第一个/最后一个元素是没有多大意义的。
在栈操作(如pushpop)方面,您应该总是谈论堆栈的顶部底部

enqueue和dequeue是否与pop和push相同?

不是。像enqueuedequeue这样的操作是针对另一种称为队列的数据结构。队列与堆栈在行为和支持的操作方面不同。
例如,虽然堆栈总是在顶部添加或删除元素,但队列总是在集合的后面添加(即enqueue)项目,并以先进先出(FIFO)顺序在前面删除(即dequeue)元素。
 +-- front
 v
+--+----+----+----+----+---+
15 | 34 | 23 | 32 | 15 | 5 | 
+--+----+----+----+----+---+
                         ^
                         +-- back

如果你将队列的行为比作商店排队,那么更容易理解该结构的正确行为。每次在商店排队时,你都在排队。

那么enqueue(40)会将40添加到队列的末尾吗?

是的。现在队列看起来像这样:

 +-- front
 v
+--+----+----+----+----+---+----+
15 | 34 | 23 | 32 | 15 | 5 | 40 |
+--+----+----+----+----+---+----+
                              ^
                              +-- back

dequeue(100)会做什么?

这与我描述的pop问题相似:没有意义,因为dequeue是用来从队列始终移除前面的元素。因此,队列只支持dequeu()并自动删除位于“队首”的任何内容:

 +-- front
 v
+--+----+----+----+----+---+
34 | 23 | 32 | 15 | 5 | 40 |
+--+----+----+----+----+---+
                         ^
                         +-- back

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接