【スタックとキュー】剣指Offer:min関数を含むスタック
6226 ワード
【オンラインプログラミング】min関数を含むスタック
【問題の説明】
スタックのデータ構造を定義し、スタックに含まれる最小要素を得ることができるmin関数(時間複雑度はO(1))をこのタイプで実装します.
【解題構想&Java実現】
方法:stackスタックはデータを格納し、補助スタックminを借りてstackの各状態における最小値を同期的に記録するために使用される.すなわち、minのスタックトップは常に現在のstackスタックの最小要素を保持するため、stackスタックがpush操作を行う際、nodeとminスタックトップ要素の大きさを比較し、minスタックにpushの小さい値を与える.stackがpop操作を行う場合、minに対してpop操作を同時に行う.注意:popはスタックを削除するスタックトップ要素であり、peekはスタックを返すスタックトップ要素であるが、削除しない.
【問題の説明】
スタックのデータ構造を定義し、スタックに含まれる最小要素を得ることができるmin関数(時間複雑度はO(1))をこのタイプで実装します.
【解題構想&Java実現】
方法:stackスタックはデータを格納し、補助スタックminを借りてstackの各状態における最小値を同期的に記録するために使用される.すなわち、minのスタックトップは常に現在のstackスタックの最小要素を保持するため、stackスタックがpush操作を行う際、nodeとminスタックトップ要素の大きさを比較し、minスタックにpushの小さい値を与える.stackがpop操作を行う場合、minに対してpop操作を同時に行う.注意:popはスタックを削除するスタックトップ要素であり、peekはスタックを返すスタックトップ要素であるが、削除しない.
import java.util.Stack;
public class Solution {
Stack<Integer> stack = new Stack<>();
Stack<Integer> min = new Stack<>();
public void push(int node) {
stack.push(node);
if (min.isEmpty() || node < min.peek()) {
min.push(node);
} else {
min.push(min.peek());
}
}
public void pop() {
if (stack.isEmpty()) {
throw new RuntimeException("Stack is empty!");
}
stack.pop();
min.pop();
}
public int top() {
return stack.peek();
}
public int min() {
return min.peek();
}
}