8

从我读过的所有资料来看,他们说 - peek 和 pop 之间的区别在于 peek 不会删除最高值。在我的讲义中提供的示例中,显然他们使用不同的减法方法做了同样的事情。在两次操作之后,top 都减去了 1。

我对吗?可能不是,有人可以解释这些有何不同吗?

int pop(void)
{
    assert(top>0);
    return data[--top];
}
int peek(void)
{
    assert(top>0);
    return data[top-1];
}
4

7 回答 7

10

top是堆栈的状态变量,在这种情况下,它是存储在常规数组中的堆栈。该变量top通过存储数组索引来引用堆栈的顶部。

第一个操作pop使用减量运算符来更改变量top--top相当于top = top - 1。因此,在调用pop 堆栈的状态后也发生了变化。旧值将保留在数组中,但由于变量top现在引用了不同的索引,因此该值被有效地删除:堆栈的顶部现在是不同的元素。现在如果你调用 a push,这个弹出的值将被覆盖。

第二个操作不会改变变量的值top,它只是用它来返回栈顶的值。该变量仍然引用与堆栈顶部top相同的值,因此堆栈未更改。

于 2012-09-14T19:58:47.350 回答
5

它们将返回相同的值,但仅 pop 更改顶部:

--top

这相当于

top = top -1

其中 top - 1 不会改变 top 的值。

于 2012-09-14T19:57:56.190 回答
5

在一般编程术语中,“pop”是指从堆栈中返回对象的方法,同时将其从堆栈中删除。术语“peek”更通用,可用于其他数据容器/ADT,而不是堆栈。“偷看”总是意味着“给我下一个物品,但不要从容器中取出它”。

大多数情况下,“peek”与类似队列的数据容器一起使用,例如用于检查 Windows 消息队列中下一条消息的 Windows API 函数名为 PeekMessage()。

于 2012-09-14T20:04:35.030 回答
2

这个

return data[--top];

更改topwhile this的值

return data[top-1];

不会改变它。因此,当您调用pop指向堆栈顶部的指针时,会将指针修改为指向新项目,同时peek保持指针不变,因此函数的行为与您描述的正确含义相同

于 2012-09-14T19:58:30.250 回答
2

pop这样做的过程--toptop=top-1,它改变了 的值top

而在 中peek,它的行为,top-1即只是减top1 并使用该值,top是不变的。

于 2012-09-14T19:58:48.350 回答
0

pop 的功能 - 它提取顶部元素并移动到它之前的下一个元素。因此指针现在移动到下一个元素。顶部元素位置现在减少 1。

peek 的功能 - 它只返回顶部元素但指针仍然存在。所以顶部元素位置保持不变。

于 2019-01-23T05:32:27.043 回答
-2

实际上 pop 和 peak 是一样的,但问题是前者看到数据并关闭了盒子,但后来先拿了数据看到了它并关闭了盒子

于 2016-04-09T16:34:29.587 回答