包含min函数的栈
题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
题目解析
题目要求是得到栈中所含的最小元素并且时间复杂度为O(1),表示一取就是当前栈的最小最小元素,我们可以考虑用两个栈来存放数据,一个是正常的元素栈,一个是最小元素栈。放入的规则是,正常元素栈每次都直接放入栈顶,最小元素栈则需要比较当前值比最小元素栈的栈顶的数据小的时候才放入(最小元素栈保持着栈顶到栈底从小到大的顺序),如果中途需要弹出栈顶元素的时候,先判断正常元素栈的栈顶元素是不是等于最小元素栈的栈顶数据,如果相等的时候,正常元素栈和最小元素栈的栈顶数据都弹出,否则正常元素栈的栈顶元素弹出(最小元素栈依旧是按大小顺序的元素栈)。
代码
public class Solution {
//stack1正常元素,stack1排序元素
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
// 压栈
public void push(int node) {
if(stack2.isEmpty()){
stack2.push(node);
}else{
if(node <= stack2.peek()){//比栈顶的数据小的放入
stack2.push(node);
}
}
stack1.push(node);
}
// 弹栈
public void pop() {
if(stack1.peek() == stack2.peek()){
stack2.pop();
}
stack1.pop();
}
// 返回栈顶元素
public int top() {
return stack1.peek();
}
public int min() {
return stack2.peek();
}
}