最小棧
實現一個棧,該棧帶有出棧(pop)、入棧(push)、取最小元素(getMin)3個方法
實現思路
使用一個主棧
,存儲數據,一個輔助棧
,存儲當前主棧
元素的最小數
-
主棧
進棧時,如果輔助棧
爲空,也進輔助棧
,如果進棧元素小於輔助棧
的棧頂元素,這個元素也進輔助棧
中,否者只進主棧
-
主棧
出棧時,如果出棧元素等於輔助棧
的棧頂元素,輔助棧
的棧頂元素也出棧,否則只出主棧
的元素 -
查看最小元素的只需將
輔助棧
的元素取出查看
代碼實現
/**
* 最小棧
* @author hzj
*/
public class MinStack {
private Stack<Integer> mainStack;
private Stack<Integer> minStack;
public MinStack() {
mainStack = new Stack<Integer>();
minStack = new Stack<Integer>();
}
public Stack<Integer> getMainStack() {
return mainStack;
}
public void setMainStack(Stack<Integer> mainStack) {
this.mainStack = mainStack;
}
public Stack<Integer> getMinStack() {
return minStack;
}
public void setMinStack(Stack<Integer> minStack) {
this.minStack = minStack;
}
/**
* 進棧
* @param element 進棧元素
*/
public void push(int element) {
//判斷最小棧的棧頂元素是否與進棧的元素大
if (minStack.isEmpty() || minStack.peek() >= element) {
minStack.push(element);
}
mainStack.push(element);
}
/**
* 刪除棧頂的元素(出棧)
* @return 棧爲空,返回null,否則直接返回
*/
public Integer pop() {
if (mainStack.isEmpty()) {
return null;
}
//判斷出棧元素是否是棧中的最小值
if (mainStack.peek().equals(minStack.peek())) {
minStack.pop();
}
return mainStack.pop();
}
/**
* 棧中的最小元素
* @return 棧爲空返回null,否則返回主棧中的最小值
*/
public Integer getMin() throws Exception {
if (minStack.isEmpty()) {
return null;
}
return minStack.peek();
}
}
在出棧和查看棧頂元素的時候,需要判斷該棧是否爲空