完整代码地址
题目
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。
思路
用一个值来保存最小值是行不通的,因为栈pop操作后,最小值就变了。
但是可以使用另外一个栈minStack来保存最小值。
每次push操作时,将当前最小值与新元素对比得出新的最小值,同时push进minStack。
每次pop操作时,两个栈同时pop。
代码
public class _30_MinInStack {
private Stack<Integer> stack = new Stack<>();
private Stack<Integer> minStack = new Stack<>();
public void push(int node) {
stack.push(node);
if(minStack.isEmpty()) {
minStack.push(node);
}
else if(minStack.peek() > node) {
minStack.push(node);
}
else {
minStack.push(minStack.peek());
}
}
public void pop() {
stack.pop();
minStack.pop();
}
public int top() {
return stack.peek();
}
public int min() {
return minStack.peek();
}
}
测试
public class _30_Test {
public static void main(String[] args) {
test1();
}
/**
* 1.新压入栈的数字比之前的最小值大
* 2.新压入栈的数字比之前的最小值小
* 3.弹出栈的数字不是最小元素
* 4.弹出栈的数字是最小元素
*/
private static void test1() {
_30_MinInStack mis = new _30_MinInStack();
mis.push(4);
mis.push(5);
mis.push(6);
MyTest.equal(mis.top(), 6);
MyTest.equal(mis.min(), 4);
mis.pop();
mis.pop();
MyTest.equal(mis.top(), 4);
MyTest.equal(mis.min(), 4);
mis.push(2);
MyTest.equal(mis.top(), 2);
MyTest.equal(mis.min(), 2);
mis.pop();
MyTest.equal(mis.top(), 4);
MyTest.equal(mis.min(), 4);
}
}