8

私が読んだすべての情報源から、彼らは言います-ピークとポップの違いは、ピークがトップバリューを削除しないということです。私の講義ノートから提供された例では、明らかに、異なる減算方法を使用して同じことを行っています。両方の操作の後、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別のインデックスを参照するようになったため、この値は効果的に削除されます。スタックの最上位は別の要素になります。これで、を呼び出すとpush、このポップされた値が上書きされます。

2番目の操作は変数の値を変更せずtop、スタックの最上位の値を返すためにのみ使用します。変数は引き続きスタックの最上位topと同じ値を参照するため、スタックは変更されません。

于 2012-09-14T19:58:47.350 に答える
5

一般的なプログラミング用語では、「ポップ」とは、スタックからオブジェクトを返すと同時に、スタックからオブジェクトを削除する方法を意味します。「ピーク」という用語はより一般的であり、スタック以外のデータコンテナ/ADTで使用できます。「ピーク」とは、常に「次のアイテムをくれますが、コンテナから取り出さないでください」という意味です。

ほとんどの場合、「peek」はキューのようなデータコンテナと一緒に使用されます。たとえば、Windowsメッセージキュー内の次のメッセージをチェックするためのWindows API関数は、PeekMessage()という名前です。

于 2012-09-14T20:04:35.030 に答える
5

それらは同じ値を返しますが、ポップの変更のみがトップになります。

--top

これはと同等です

top = top -1

ここで、top-1はtopの値を変更しません。

于 2012-09-14T19:57:56.190 に答える
2

これ

return data[--top];

whilethisの値を変更しtopます

return data[top-1];

それを変更しません。したがって、popスタックの最上位へのポインターを呼び出すと、ポインターを変更せずに新しいアイテムをpeek指すように変更されるため、関数は説明した正しい意味で動作します。

于 2012-09-14T19:58:30.250 に答える
2

そのpopため、の値--toptop=top-1変更されますtop

にいる間peek、その実行、top-1つまり1だけデクリメントtopし、値を使用することtopは変更されません。

于 2012-09-14T19:58:48.350 に答える
0

popの機能-一番上の要素を抽出し、その前に次の要素に移動します。そのため、ポインタが次の要素に移動します。一番上の要素の位置が1減少します。

ピークの機能-最上位の要素のみを返しますが、ポインタはまだそこにあります。したがって、最上位の要素の位置は変更されません。

于 2019-01-23T05:32:27.043 に答える
-2

実際にはポップとピークは同じですが、前者はデータを見てボックスを閉じましたが、後者は最初にデータを見てデータを見てボックスを閉じました

于 2016-04-09T16:34:29.587 に答える