您的位置:首页 > 其它

包含min函数的栈

2016-07-22 00:56 267 查看
来源:牛客网、《剑指offer》

定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。要求push pop min 操作的复杂度为O(1)。

考虑使用两个栈,一个数据栈,等同于普通的栈,实现push pop peek 等操作;另一个辅助栈实现min函数。

这题关键在于用辅助栈储存什么值。要保证辅助栈的top是最小值,pop之后的顶部仍然是最小值。也就是说辅助栈从上到下存储的应该是最小值->次小值->次次小值……

这里容易进入一个误区就是:难道辅助栈就是对数据栈的排序?如果真是这样,push的时候因为要排序不能满足O(1);数据栈pop的时候,辅助栈要先查找数据栈pop出去的值然后再pop,也不满足O(1)。

当两个栈为空时,push进去的第一个值即为最小值;

push第二个元素时,若push的值<辅助栈顶元素(此处即第一个值),则将此值压进辅助栈;若push的值大于等于辅助栈顶元素,则将辅助栈顶元素再次push进去。

pop的时候,数据栈辅助栈均弹出顶元素。

java code:

import java.util.Stack;

public class TT {
Stack<Integer> stack1 = new Stack<Integer>(); // 数据栈
Stack<Integer> stack2 = new Stack<Integer>(); // 辅助栈 用于返回min值

public void push(int node) {
stack1.push(node);
if (stack2.empty()) {
stack2.push(node);
} else {
if (node < stack2.peek().intValue())
stack2.push(node);
else stack2.push(stack2.peek());
}

}

public void pop() {
if (!stack1.empty())
stack1.pop();
if (!stack2.empty())
stack2.pop();
}

public int top() {
if (!stack1.empty())
return stack1.peek().intValue();
else return 0;
}

public int min() {
if (!stack2.empty())
return stack2.peek().intValue();
else return 0;
}
}


参考资料:《剑指offer》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: