最小栈
实现一个栈,该栈带有出栈(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();
}
}
在出栈和查看栈顶元素的时候,需要判断该栈是否为空