题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数,在该栈中,调用min,push,及pop的时间复杂度都为O(1)。
直接上代码:
import java.util.Stack;
public class Solution {
Stack<Integer> stack1 = new Stack<>(); //创建两个栈 Stack1作为主栈
Stack<Integer> stack2 = new Stack<>(); //用辅栈来存放最小数据
public void push(int node) {
stack1.push(node); //主栈存放数据
if (stack2.isEmpty()) { //如果辅栈为空,添加该数据。
stack2.push(node);
} else if (node < stack2.peek()) {
//如果新添数据比辅栈最小值还要小,那么辅栈添加该数据
stack2.push(node);
}
}
public void pop() { //在弹出的时候,如果当前弹出值为最小值,辅栈也进行pop。
if(stack1.peek()==stack2.peek())
stack2.pop();
stack1.pop();
}
public int top() {
return stack1.peek(); //top只是返回栈顶元素,不用进行增删操作。
}
public int min() {
return stack2.peek(); //返回辅栈栈顶元素,栈顶存放的是最小元素。
}
}
分析:
我们用一个辅栈Stack2来记录栈的最小值为多少,以添加{9,12,5,18,3}中途取出部分数据为例,具体操作如下:
这里使用栈顶工作模式是满递减模式。
1)我们添加数字9,主栈无论何时正常添加,辅栈因为是空栈,进行添加此时的栈最小元素是9
2)我们添加数字12,主栈照常添加,辅栈因为12>9,我们辅栈不进行添加(书上老师的做法是辅栈添加元素9,这里对老师的做法进行简单优化处理)
3)添加元素5,主栈正常添加,辅栈添加元素5(5<9)
4)添加元素18,主栈照常添加,辅栈不进行任何操作(18>5)
5)如果我们此时要取出数据,例如用户进行pop操作,主栈pop返回数据18,因为此时(18!=5)因此,辅栈不进行任何操作;
if(stack1.peek()==stack2.peek())
stack2.pop();
stack1.pop();
6)此时再进行pop操作,主栈pop的数字是5,此时5是最小元素,因此辅栈也进行pop操作
剩下的我想就不用介绍了,希望可以帮助大家,如果大家发现问题,欢迎指出。