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添加为最后一个数字。
这是不正确的,或者至少是模糊的:你认为“最后”元素在哪里?对你来说,“最后”是什么意思?问题在于,“第一个”和“最后一个”这样的术语暗示了顺序,这是队列需要处理的事情(稍后会讲到)。然而,栈并不是按照这种意义上的有序集合,因此在栈的上下文中谈论第一个/最后一个元素是没有多大意义的。
在栈操作(如
push
和
pop
)方面,您应该总是谈论堆栈的
顶部或
底部。
enqueue和dequeue是否与pop和push相同?
不是。像
enqueue
和
dequeue
这样的操作是针对另一种称为
队列的数据结构。队列与堆栈在行为和支持的操作方面不同。
例如,虽然堆栈
总是在顶部添加或删除元素,但队列
总是在集合的后面添加(即
enqueue
)项目,并以先进先出(FIFO)顺序在前面删除(即
dequeue
)元素。
+
v
+
15 | 34 | 23 | 32 | 15 | 5 |
+
^
+
如果你将队列的行为比作商店排队,那么更容易理解该结构的正确行为。每次在商店排队时,你都在排队。
那么enqueue(40)会将40添加到队列的末尾吗?
是的。现在队列看起来像这样:
+
v
+
15 | 34 | 23 | 32 | 15 | 5 | 40 |
+
^
+
dequeue(100)会做什么?
这与我描述的pop
问题相似:没有意义,因为dequeue
是用来从队列始终移除前面的元素。因此,队列只支持dequeu()
并自动删除位于“队首”的任何内容:
+
v
+
34 | 23 | 32 | 15 | 5 | 40 |
+
^
+