スタックを実装するには、スタックは、スタック(POP)、プッシュ(押し)を有する三最小要素法(getMin)を取ります。3つの方法の時間計算量はO(1)であることを保証します。
例えば:
*スタックのボトム- >スタック
* 4,9,7,3,8,5
アイデア:
単なる最小値を記録したときにスタックとしてスタックの最小要素。スタック操作の後が行われてもよいので、最小の要素が見つからないように、最小値は、ポップです。
右のアイデア:
-
- スタックは、時間の各メイン要素をプッシュし、スタックのバックアップを作成し、スタックのバックアップのすべてのトップの要素を比較
- メインスタックプッシュしながら、メインスタックプッシュ要素は、要素をプッシュする、バックアップスタックの最上位要素よりも小さい、バックアップスタックです。
- メインスタックのポップ要素、およびスタックの最上位要素をバックアップする必要がある場合、および等しい場合、最上位の要素はスタックをポップすることができ、バックアップする必要があります。
コードの実装:
1つの インポートjava.util.ArrayListのの、 2 インポートjava.util.Listに、 3 インポートjava.util.Stackを、 4 / ** 5。 *スタックを実装するために、スタック(POP)を有するスタックプッシュ(押し)、方法は、3つの最小要素(getMin)をとります。 6 (1)* 3つの方法の時間計算量はOであることを確実にするために 7 * 8 *スタックの底- >スタック 。9 * 4,9,7,3,8,5 10 * /
11 パブリック クラスMinStack { 12であります プライベートスタック<整数> = mainStack 新しい新しいスタック<> (); 13は、 プライベートスタック<整数> = minStack 新しい新しいスタック<> (); 14 15 パブリック ボイドプッシュ(int型の要素){ 16 mainStack.push(要素) 17 であれば(minStack.empty()||要素<= minStack.peek()){ 18 minStack.push(要素) 19 } 20 } 21 22 公衆整数ポップ(){ 23 であれば(mainStack.peek()に等しい(minStack.peek())){ 24 minStack.pop()。 25 } 26 リターンmainStack.pop()。 27 } 28 29 公衆整数getMinElement(){ 30 であれば(!minStack.isEmpty()){ 31 リターンminStack.peek()。 32 } 他{ 33 リターン ヌル。 34 } 35 } 36 37 公衆リスト<整数> getStackElement(){ 38 一覧<整数> elementList = 新規のArrayList <> (); 39 のためには、(int型 i = 0; iはmainStack.size()<; I ++のを){ 40 elementList.add(mainStack.get(I))。 41 } 42 リターンelementList。 43 } 44 45 46 公共 静的 ボイドメイン(文字列[]引数){ 47 MinStackスタック= 新しいMinStack()。 48 stack.push(4 )。 49 stack.push(9 )。 50 stack.push(7 )。 51 stack.push(3 )。 52 stack.push(8 )。 53 stack.push(5 )。 54 のSystem.out.println(stack.getStackElement()のtoString())。 55 System.out.println( "最小要素である:" + stack.getMinElement())。 56 のSystem.out.println( "ポップスタート..." ); 57 stack.pop()。 58 stack.pop()。 59 stack.pop()。 60 のSystem.out.println( "ポップ終わり..." ); 61 のSystem.out.println(stack.getStackElement()のtoString())。 62 のSystem.out.println( "最小要素である:" + stack.getMinElement())。 63 } 64 }
結果:
[4、9、7、3、8、5 ] 最小要素である: 3 ポップ開始... ポップ端... [ 4、9、7 ] 最小要素である: 4