使用内置的栈实现O(1)计算栈的最小元素,即使用一个栈记录栈元素,一个栈记录当前栈的最小元素,以空间换时间
import java.util.Stack;
/**
* 栈
* @author yinming.yu
*
*/
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
MyStack stack = new MyStack();
int[] a = {9, 2, 1, 10, -59};
for(int item : a){
stack.push(item);
System.out.println("当前入栈元素 "+item+" 该元素入栈后,栈内最小元素为 "+stack.min.peek());
}
while(!stack.isEmpty()){
int top = stack.pop();
System.out.println("当前出栈元素 "+top+" 该元素出栈后,栈内最小元素为 "+(stack.isEmpty()?"栈已空,没有最小值了":stack.min.peek()));
}
/**
* 输出结果:
* 当前入栈元素 9 该元素入栈后,栈内最小元素为 9
当前入栈元素 2 该元素入栈后,栈内最小元素为 2
当前入栈元素 1 该元素入栈后,栈内最小元素为 1
当前入栈元素 10 该元素入栈后,栈内最小元素为 1
当前入栈元素 -59 该元素入栈后,栈内最小元素为 -59
当前出栈元素 -59 该元素出栈后,栈内最小元素为 1
当前出栈元素 10 该元素出栈后,栈内最小元素为 1
当前出栈元素 1 该元素出栈后,栈内最小元素为 2
当前出栈元素 2 该元素出栈后,栈内最小元素为 9
当前出栈元素 9 该元素出栈后,栈内最小元素为 栈已空,没有最小值了
*/
}
}
/**
* 使用O(1)求栈中的最小元素
*
*
*/
class MyStack{
Stack<Integer> element = new Stack<Integer>();//存放元素
Stack<Integer> min = new Stack<Integer>();//存放栈中当前最小元素
//如果当前入栈元素可以成为最小值,那么同时入栈最小值栈
public void push(Integer item){
element.push(item);
//如果当前入栈元素小于或等于当前最小元素,那么就入min栈
if(min.isEmpty()){
min.push(item);
}else{
if(item <= min.peek()){
min.push(item);
}
}
}
public Integer pop(){
int top = element.pop();
//如果当前最小值出栈,min栈保存的最小值也要出战,2这最小值保持一致
if(top == min.peek()){
//min也需要出栈
min.pop();
}
return top;
}
public boolean isEmpty(){
return element.isEmpty();
}
}