定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。
方法一: 使用两个栈,一个完成数据的出栈入栈操作,另一个辅助栈存储每次操作之后得到的最小值。
import java.util.Stack;
public class Solution {
Stack stack1 = new Stack();Stack stack2 = new Stack(); //辅助栈stack2存的是每次操作后,获取的最小值
int min = 0;
public void push(int node) {
stack1.push(node);
if(stack1.size()==1){
min = (int)stack1.peek();
}else{
if( min > node){ //每加入一个元素,都需要将其与最小值比较,判断此次操作后的最小值
min = node;
}
}
stack2.push(min);
}
public void pop() {
stack1.pop(); //如果出栈的元素大于min,那么stack2的栈顶元素与倒数第二个是相同的,所以删掉一个后,最 小值仍然是栈顶元素
stack2.pop(); //无论栈顶元素与min是否相等,都需要向下移动一个,要保证辅助栈stack2中值与操作的一致 性
min = (int)stack2.peek();
}
public int top() {
return (int)stack1.peek();
}
public int min() {
return min;
}
}
方法二: 原理同方法一,只是数据操作的栈是自定义栈,通过数组扩容完成
import java.util.Stack;
import java.util.Arrays;
public class Solution {
//使用一个辅助栈与一个自定义栈,自定义栈实现数据出栈入栈功能,辅助栈存储最小值
private Integer[] elements = new Integer[10];
private int size = 0;
private int min = 0;
private Stack<Integer> minStack = new Stack<Integer>();
public void push(int node) {
ensureCapacity(size+1);//确保可以再添加一个元素,如果不够就扩容
elements[size++]=node; //添加元素,数组元素个数为size
if(size==1){
min = node;
}else{
if(node < min){
min = node;
}
}
minStack.push(min);
}
public void ensureCapacity(int size){
int len = elements.length;
if(size > len){
int newlen = len*2;
elements = Arrays.copyOf(elements,newlen);
}
}
public void pop() {
if(size>=1){
elements[size-1]=null;
//此处需要注意,int[]数组元素不能设置为null,即使是(Integer)null,也会报空指针异常
//因此使用 Integer[] 数组
}size--;
minStack.pop();
min = minStack.peek();
}
public int top() {
if(size >=1){
return elements[size-1];
}
return (Integer)null;
}
public int min() {
return min;
}
}