題目:
實現一個棧,該棧帶有出棧,入棧,取最小元素3個方法,要保證3個方法的時間複雜度都是O(1);
解題思路:
1.設原有的棧叫做棧A,此時額外創建一個棧B,用於輔助棧A
2.當第一個元素進入棧A時,讓新元素也進入棧B,這個唯一的元素就是棧A的當前最小值
3.之後,每當新元素進入棧A時,比較新元素和棧A當前最小值的大小,如果小於棧A當前最小值,則讓新元素進入棧B,此時棧B的棧頂元素就是棧A當前最小值
每當棧A有元素出棧時,如果出棧元素時站A當前最小值,則讓棧B的棧頂元素也出棧,此時棧B餘下的棧頂元素所指向的,是棧A當中原本第2 小的元素,代替剛纔的出棧元素稱爲棧A當前最小值
5.當調用getMin方法的時候,返回棧B的棧頂所存儲的值,這也是棧A的最小值。
import java.util.Stack;
public class getMinStack {
private Stack<Integer> mainStack = new Stack<Integer>();
private Stack<Integer> minStack = new Stack<Integer>();
//入棧
public void push(int element){
mainStack.push(element);
//如果輔助站爲空,或則新元素小於或者等於輔助棧棧頂,則將新元素壓入棧
if(minStack.empty() || element <= minStack.peek()){
minStack.push(element);
}
}
//出棧
public Integer pop(){
//如果出棧元素和輔助棧棧頂元素值相等,輔助棧出棧
if(mainStack.peek().equals(minStack.peek())){
minStack.pop();
}
return mainStack.pop();
}
//獲取最小元素
public int getMin() throws Exception{
if(mainStack.empty()){
throw new Exception("stack is empty");
}
return minStack.peek();
}
public static void main(String[] args) throws Exception{
getMinStack stack = new getMinStack();
stack.push(4);
stack.push(9);
stack.push(7);
stack.push(3);
stack.push(8);
System.out.println(stack.getMin());
stack.pop();
stack.pop();
System.out.println(stack.getMin());
}
}