用JAVA代码实现出栈入栈并获取栈中最小值的程序

【前言】

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



发布了15 篇原创文章 · 获赞 8 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/z_programmer/article/details/53443622