数据结构:在此类练习中解释pop,push,dequeue,enqueue

时间:2015-12-10 10:32:42

标签: c++ data-structures push pop

我试图让这些4个概念变得更加舒服。

所以如果我们有一个{15, 34, 23, 32, 15, 5}

的数组

我们有

等操作
pop();
push(30);
enqueue(40);
dequeue(100);

pop()会删除第一个数字,即15,对吗? 如果它是pop(20)怎么办?

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

像pop和push一样排队和出队工作吗?

(那么会排队(40)在后面加40?什么会出队(100)呢?)

1 个答案:

答案 0 :(得分:7)

  

pop()会删除第一个数字,即15,对吗?如果   它是pop(20)?

如果您将操作与特定数据结构相关联,我认为理解这些概念会更容易。

例如,push(item)pop()等操作适用于堆栈,而enqueue(item)dequeue()等操作适用于< em> queue ,两者都有特定且定义明确的行为。

叠加只能使用顶部上的项目,就像一叠薄煎饼,纸张或任何其他物品集合放在一起。

这意味着您的{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)这样的操作没有意义:它不再局限于堆栈 top 的项目。

  

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

这是不正确的,或者至少是模棱两可的:你认为“最后”元素在哪里? “最后”对你意味着什么?这里的问题是像“第一”和“最后”这样的术语暗示了顺序,这是队列的意思(见后面)。但是, stacks 在这个意义上不是有序集合,所以谈论堆栈上下文中的第一个/最后一个元素没有多大意义。

pushpop等堆栈操作而言,你应该总是谈论堆栈的 top bottom

  

将工作与pop和push一样排队和出列吗?

没有。 enqueuedequeue等操作适用于称为队列的不同数据结构。队列与它们的行为方式以及它们支持的操作不同。

例如,当堆栈总是在顶部添加或删除元素时,队列总是在集合的后面添加(即enqueue)项并按先进先出(FIFO)顺序删除前面的元素(即dequeue)。

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

如果您根据商店中的一行来考虑队列的行为,那么关联结构的正确行为会更容易。每当你在商店排队时,你就会排队等候。

  

然后会排队(40)在后面添加40?

正确。队列现在看起来像这样:

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

什么会出列(100)呢?

这类似于我在pop中描述的问题:它没有意义,因为dequeue意味着总是删除前面的元素。因此,队列只支持dequeue(),它会自动删除“行”前面的任何内容:

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