题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1) )。
分析
本题需要两个栈,一个作为主栈进行存入,存全部的元素,一个作为辅助栈存入当前最小的元素,能不能存入的依据就是是否能比辅助栈已经存入的元素更小。辅助栈只当作存当前最小元素的栈,入栈push操作、出栈pop操作、获取栈顶元素top操作均由主栈完成,辅助栈只在最后完成获取最小元素的min操作。
实现代码如下:
import java.util.Stack;
public class Solution {
Stack<Integer> data = new Stack<Integer>();
Stack<Integer> min = new Stack<Integer>(); //辅助栈存放当前最小元素(要比之前压入栈的小)
Integer temp = null;
public void push(int node) {
if(temp != null){
//更小则压入min辅助栈中,否则就只入栈data
if(node <= temp){
data.push(node);
min.push(node);
temp = node;
}else{
data.push(node);
}
}else{
//temp为null即为初始时,两个栈都为空,则都进行入栈操作
data.push(node);
min.push(node);
temp = node;
}
}
public void pop() {
int num1 = data.pop();
int num2 = min.pop();
if(num1 != num2){
min.push(num2);
}
}
public int top() {
//获取栈顶元素,辅助栈只用来获取最终最小的元素,所以返回data栈的栈顶元素
int num1 = data.pop();
int num2 = min.pop();
if(num2 != num1){
min.push(num2);
return num1;
}else{
return num1;
}
}
public int min() {
//所有数都存入完毕后,返回栈顶最小的元素
int num = min.pop();
min.push(num);
return num;
}
}