题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。
用了两种方法,第一种是new一个栈存当前最小数,再new一个栈存储原数据
import java.util.Stack;
public class Solution {
Stack<Integer> sk = new Stack<>();
Stack<Integer> min = new Stack<>();
public void push(int node) {
if(sk.empty()){
sk.push(node);
min.push(node);
}else{
if(node < min.peek()){
sk.push(node);
min.push(node);
}else{
sk.push(node);
min.push(min.peek());
}
}
}
public void pop() {
sk.pop();
min.pop();
}
public int top() {
return sk.peek();
}
public int min() {
return min.peek();
}
}
第二种方法是只用一个栈,和一个top变量,栈用来记录之前最小值减当前入栈值,top用来记录栈顶值,当出栈时,就可以用top和栈的值来还原原数据
import java.util.Stack;
public class Solution {
Stack<Integer> sk = new Stack<>();
int top,min;
public void push(int node) {
if(sk.empty()){
min = node;
sk.push(0);
}else{
int t = node - min;
sk.push(t);
if(min > node) min = node;
}
top = node;
}
public void pop() {
if(min == top){
if(sk.peek() <= 0){
min = min - sk.peek();
}
}
top = top - sk.peek();
sk.pop();
}
public int top() {
return top;
}
public int min() {
return min;
}
}