挿入と削除がO(1)の複雑さであるという最初の仮定に従えば(上に挿入し、上から削除/ポップするだけの場合、スタックは正常に機能します)、getMinに最小値を返すようにします一定の時間で、あなたは何とかして分を保存する必要があるでしょう。メンバー変数に最小値を追跡させた場合、スタックから削除された場合はどうなりますか?次の最小値、またはスタックに残っているものに関連する最小値が必要になります。これを行うには、スタック内の要素に最小と思われるものを含めることができます。スタックはリンクリストによってコードで表されるため、リンクリスト内のノードの構造体は次のようになります。
struct Node
{
int value;
int min;
Node *next;
}
リストの例を見ると、7-> 3-> 1->5->2です。これがどのように構築されるかを見てみましょう。最初に値2を(空のスタックに)プッシュします。これは最初の数値であるため最小値です。これを追跡し、作成時にノードに追加します:{2、2}。次に、5をスタックにプッシュします(5> 2)。これにより、最小値は{5,2}と同じになり、{5,2}->{2,2}になります。次に、1を押し込み、1 <2なので、新しい最小値は1になり、{1、1}を押します。これで、{1,1}->{5,2}->{2,2}などになります。持ってる:
{7,1}-> {3,1}-> {1,1}-> {5,2}-> {2,2}
この実装では、7、3、および1をポップオフした場合、新しい最小値は2になります。また、ノードに比較と別の値を追加しただけなので、すべての操作は一定時間のままです。(C ++のpeek()のようなものを使用するか、リストの先頭へのポインターを使用してスタックの先頭を確認し、そこで最小値を取得すると、一定時間でスタックの最小値が得られます。 )。
この実装のトレードオフは、ノードに余分な整数が含まれることです。非常に大きなリストに1分または2分しかない場合は、メモリの浪費になります。この場合、別のスタックで分を追跡し、削除するノードの値をこのリストの一番上と比較し、一致する場合は両方のリストから削除することができます。追跡することがもっとあるので、それは本当に状況に依存します。
免責事項:これはこのフォーラムでの私の最初の投稿なので、少し複雑または言葉遣いである場合は申し訳ありません。また、これが「1つの真の答え」であると言っているわけではありませんが、最も単純で、質問の要件に準拠していると思います。常にトレードオフがあり、状況に応じてさまざまなアプローチが必要になります。