【前言】
言归正传,昨晚看到一个有关出栈入栈并获取栈中最小值的案例,机会难得,用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 入栈演示: