pop() 只会删除第一个数字,即 15,对吧?如果什么
这是流行音乐(20)?
我认为如果将操作与特定的数据结构联系起来,您会更容易理解这些概念。
例如,类似的操作push(item)
and pop()
是为了一个stack而像这样的操作enqueue(item)
and dequeue()
是为了一个queue,两者都有特定且明确定义的行为。
堆栈仅适用于位于top,就像一堆煎饼、纸张或任何其他相互叠放的物品集合。
这意味着您的{15, 34, 23, 32, 15, 5}
数组可以这样查看:
| 15 | <--- top
| 34 |
| 23 |
| 32 |
| 15 |
| 5 |
+----+
Here, pop
只需删除顶部的元素,然后离开top
指向紧接其下方的元素(即 34)。显然,使用push(8)
会在堆栈顶部添加一个新元素(即 8),所以它现在看起来像这样:
| 8 | <--- top
| 34 |
| 23 |
| 32 |
| 15 |
| 5 |
+----+
由于堆栈的定义行为,像这样的操作pop(item)
没有意义:它将不再将自己限制在该项目上top堆栈的。
我假设 push(30) 会添加 30 作为最后一个数字。
这是不正确的,或者至少是不明确的:您认为“最后”元素在哪里? “最后”对你来说意味着什么?这里的问题是像“第一个”和“最后一个”这样的术语意味着顺序,这是queues是为了(见下文)。然而,stacks从这个意义上讲,它们不是有序集合,因此在堆栈上下文中谈论第一个/最后一个元素没有多大意义。
就堆栈操作而言,例如push
ing and pop
ing,你应该总是谈论top or the bottom堆栈的。
入队和出队的工作方式与弹出和推送相同吗?
不。类似的操作enqueue
and dequeue
用于不同的数据结构,称为queue。队列与堆栈的不同之处在于它们的行为方式和支持的操作。
例如,当一个堆栈always添加或删除顶部、队列的元素always添加(即enqueue
)集合后面的项目并删除(即dequeue
) 元素位于前面,按先进先出 (FIFO) 顺序。
+-- 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
是为了always删除前面的元素。因此,队列仅支持dequeue()
它会自动删除“行”前面的所有内容:
+-- front
v
+--+----+----+----+----+---+
34 | 23 | 32 | 15 | 5 | 40 |
+--+----+----+----+----+---+
^
+-- back