弹出栈顶元素和查看栈顶元素在这种情况下是一样的吗?

8

从我阅读的所有资料中,它们都说:peek和pop之间的区别在于peek不会移除顶部的值。

在我讲义笔记提供的示例中,显然它们使用不同的减法方法来执行相同的操作。在执行两个操作后,顶部都被减去了1。

我是正确的吗? 可能不是,有人能解释一下它们的区别吗?

int pop(void)
{
    assert(top>0);
    return data[--top];
}
int peek(void)
{
    assert(top>0);
    return data[top-1];
}
7个回答

10

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

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

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


5
他们将返回相同的值,但只有弹出更改了顶部:
--top

这相当于。
top = top -1

而 top - 1 不会改变 top 的值。


5
在一般的编程术语中,“pop”指的是从栈中返回一个对象,同时将其从栈中删除的方法。而术语“peek”更通用,可用于其他数据容器/ADT而不仅限于栈。 “Peek”始终意味着“给我下一个项目,但不要从容器中删除它”。
最常用的情况是将“peek”与队列类数据容器一起使用,例如Windows API函数检查窗口消息队列中的下一条消息的函数被命名为PeekMessage()。

2

This

return data[--top];

当这个代码执行时,它会改变top的值。

return data[top-1];

不改变它。因此,当您调用pop时,指向堆栈顶部的指针会被修改为指向一个新项,而peek则保持指针不变,因此这些函数以您描述的正确方式运行。


2
pop 中,它执行的是 --top,即 top=top-1,因此会改变 top 的值。
而在 peek 中,它执行的是 top-1,即仅将 top 减 1 并使用该值,top 的值不变。

0

pop函数的作用 - 它提取顶部元素并将其移动到下一个元素,因此指针现在移动到下一个元素。顶部元素位置现在减少了1。

peek函数的作用 - 它仅返回顶部元素,但指针仍然在原位。因此,顶部元素位置保持不变。


-2

实际上,pop和peak是相同的,但问题在于前者看到数据并关闭了盒子,而后者先获取数据,然后再关闭盒子。


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