从我读过的所有资料来看,他们说 - 偷看和流行之间的区别在于偷看并没有消除最高价值。 在我的讲义中提供的例子中,显然他们使用不同的减法方法做同样的事情。两个操作后,顶部减1。
我是对的吗? 可能不是,有人可以解释一下这些有何不同?
int pop(void)
{
assert(top>0);
return data[--top];
}
int peek(void)
{
assert(top>0);
return data[top-1];
}
答案 0 :(得分:7)
top
是堆栈的状态变量,存储在常规数组中。变量top
通过存储数组索引来引用堆栈的顶部。
第一个操作pop
使用递减运算符更改变量top
,因此堆栈的状态:--top
等效于top = top - 1
。该值仍在数组中,但由于变量top
现在引用了不同的索引,因此有效地删除了该值:堆栈的 top 现在是另一个元素。现在,如果您拨打push
,则会覆盖此弹出值。
第二个操作不更改变量top
的值,它只使用它来返回堆栈顶部的值。变量top
仍然引用与堆栈的 top 相同的值,因此堆栈保持不变。
答案 1 :(得分:4)
他们将返回相同的值,但只有pop更改为top:
--top
这相当于
top = top -1
其中top - 1不会改变top的值。
答案 2 :(得分:2)
此
return data[--top];
在此
时更改top
的值
return data[top-1];
不会改变它。因此,当您调用pop
时,指向堆栈顶部的指针被修改为指向一个新项,而peek
使指针保持不变,因此函数的行为与您描述的正确意义相同
答案 3 :(得分:2)
在pop
--top
top=top-1
top
,因此它会更改peek
的值。
在top-1
中,它正在执行top
,即只将top
递减1并使用该值,{{1}}保持不变。
答案 4 :(得分:2)
在一般编程术语中,“pop”表示从堆栈返回对象的方法,同时将其从堆栈中删除。术语“peek”更通用,可以用于其他数据容器/ ADT而不是堆栈。 “偷看”总是意味着“给我下一个项目,但不要将其从容器中取出”。
大多数情况下,“peek”与类似队列的数据容器一起使用,例如,用于检查Windows消息队列中的下一条消息的Windows API函数名为PeekMessage()。
答案 5 :(得分:0)
pop的功能-提取顶部元素并移至上一个元素。因此指针现在移至下一个元素.top元素的位置现在减小1。
peek的功能-它仅返回顶部元素,但指针仍在那里。因此顶部元素的位置保持不变。
答案 6 :(得分:-2)
实际上pop和peak是一样的,但事情是前者看到了数据并关闭了盒子但后来先拿数据看了它并关闭了盒子