2017-06-28 5 views
2

私はデータ構造のコースを勉強していますが、現在私は何かスタックに悩まされています。 StackTop関数の実装では(コピー又はせる「意味で戻る」スタックに影響を与えることなく、スタックの最上位要素。)以下のコードは、それの実装であり、それは明らかである、StackTop関数のこれら2つの異なる実装の違いは何ですか?

void StackTop(StackEntry *pe, Stack *ps){ 
    *pe=ps->entry[ps->top-1]; 
} 

しかし、スタックの最上位要素の値をユーザーに与えたい限り、このような関数を作ることはできませんでしたか?もしそうなら、これら2つの実装の違いは何ですか?

StackEntry StackTop(Stack *ps){ 
    return ps->entry[ps->top-1]; 
} 

StackEntryは、ユーザー定義のデータ型です。

答えて

3

どちらも使用できます。主な違いは、実行されるコピーの数です。

最初の場合、結果の値は、ポインタ逆参照によってターゲット変数に直接書き込まれます。後者の場合、値は(ほとんどの実装では)スタックに置かれ、戻り値が割り当てられていると仮定して、戻り値を受け取る変数にコピーされます。

戻り値の場合、構造体が返されているため、コンパイラは戻り値をスタックにコピーするのではなく、他の場所にコピーし、スタック上のその場所へのポインタを置いている可能性があります。しかし、これは完全に実装までです。いずれの場合も、構造体データは2回コピーされます。構造体が比較的小さい場合、構造体が数メガバイトの大きさである場合には重要になる可能性がありますが、測定可能な違いはありません。

2

両方の機能に優れた設計がありません。両方の機能の問題は、スタックが空になることができることです。この場合、関数には未定義の振る舞いがあり、それが本当であるかどうかを判断することは困難です。

スタックが空であるかどうか、あなたがいずれかを考慮しなければならない報告1つのより多くの機能があるので、あなたが関数の未定義の動作については気にしない場合は、より良い関数定義が

int StackTop(Stack *ps, StackEntry *pe) 
{ 
    int success = ps->top != 0; 

    if (success) 
    { 
     *pe = ps->entry[ps->top-1]; 
    } 

    return success; 
} 

のように見えることができますCで

スタックに格納された値を変更できるようにする、より多くの関数の実装。このような関数は、次のようになります。

StackEntry * StackTop(Stack *ps) 
{ 

    return &ps->entry[ps->top-1]; 
} 
関連する問題