【前言】言归正传,昨晚看到一个有关出栈入栈并获取栈中最小值的案例,机会难得,用java代码实现了下。
要求:实现一个栈,带有出栈(pop),入栈(push),取最小元素(getMin)三个方法
package stacktest;
import java.util.Stack;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
Stack<Integer> stack = new Stack<Integer>();
Stack<Integer> stackBackUp = new Stack<Integer>();
pushStack(stack,stackBackUp,10);
pushStack(stack,stackBackUp,7);
pushStack(stack,stackBackUp,6);
pushStack(stack,stackBackUp,4);
pushStack(stack,stackBackUp,8);
pushStack(stack,stackBackUp,3);
pushStack(stack,stackBackUp,1);
pushStack(stack,stackBackUp,2);
System.out.println("当前stack:"+stack);
System.out.println("stack下标对应的栈:"+stackBackUp);
popStack(stack,stackBackUp);
System.out.println("第1次移除操作后stack:"+stack);
System.out.println("第1次移除操作后stack下标对应的栈:"+stackBackUp);
popStack(stack,stackBackUp);
System.out.println("第2次移除操作后stack:"+stack);
System.out.println("第2次移除操作后stack下标对应的栈:"+stackBackUp);
popStack(stack,stackBackUp);
System.out.println("第3次移除操作后stack:"+stack);
System.out.println("第3次移除操作后stack下标对应的栈:"+stackBackUp);
System.out.println("stack中最小值:"+getMin(stack,stackBackUp));
}
/**
* /**
* 先进栈:
* 1:创建2个栈,一个栈放元素(stack),另外一个栈放元素下标(stakcBackUp)
* 2:向stack中放入元素时,先与stakcBackUp顶部元素(代表stack下标)所对应的stack元素比较
*
*
* @param stack
* @param stackBackUp
* @param i
*/
public static void pushStack(Stack<Integer> stack,Stack<Integer> stackBackUp,int i){
if(stack.isEmpty()){//第一次放进去的值默认最小
stack.push(i);
stackBackUp.push(0);
}else if(stack.get(stackBackUp.peek())<i){
stack.push(i);
}else{
stack.push(i);
stackBackUp.push(stack.size()-1);
}
}
/**
* 出栈操作
* 先明确:栈的原则(是一种先进后出的集合)
* 当从stack中出栈时,先与stackBackUp栈顶元素对应的值进行比较,若相同则说明此时
* stack出战的为最小值,同时将stackBackUp栈顶元素移除
* 反之仅移除stack,stackBackUp不动
*/
public static void popStack(Stack<Integer> stack,Stack<Integer> stackBackUp){
if(stack.peek()==stack.get(stackBackUp.peek())){
//System.out.println(11);
stackBackUp.pop();
stack.pop();
}else{
stack.pop();
}
}
/**
* 3:总结stackBackUp最上面的下标对应的stack中的元素最小
* @param stack
* @param stackBackUp
* @return
*/
public static int getMin(Stack<Integer> stack,Stack<Integer> stackBackUp){
return stack.get(stackBackUp.peek());
}
}
运行结果:
当前stack:[10, 7, 6, 4, 8, 3, 1, 2]
stack下标对应的栈:[0, 1, 2, 3, 5, 6]
第1次移除操作后stack:[10, 7, 6, 4, 8, 3, 1]
第1次移除操作后stack下标对应的栈:[0, 1, 2, 3, 5, 6]
第2次移除操作后stack:[10, 7, 6, 4, 8, 3]
第2次移除操作后stack下标对应的栈:[0, 1, 2, 3, 5]
第3次移除操作后stack:[10, 7, 6, 4, 8]
第3次移除操作后stack下标对应的栈:[0, 1, 2, 3]
stack中最小值:4
入栈演示: