您的位置:首页 > 职场人生

【剑指offer】面试题30:包含min函数的栈

2017-07-26 21:59 447 查看

完整代码地址

完整代码地址

题目

定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: