最小栈实现

一 思路

1.设原有的栈叫做栈A,此时创建一个额外的栈B,用于辅助原栈A。
2.当第一个元素进入栈A的时候,让新元素的下标进入栈B。这个唯一的元素是栈A的当前最小值。(考虑到栈中元素可能不是类对象,所以B栈存储的是A栈元素的下标)
3.每当新元素进入栈A时,比较新元素和栈A当前最小值的大小,如果小于栈A当前最小值,则让新元素的下标进入栈B,此时栈B的栈顶元素就是栈A当前最小值的下标。
4.每当栈A有元素出栈时,如果出栈元素是栈A当前最小值,则让栈B的栈顶元素也出栈。此时栈B余下的栈顶元素所指向的,是栈A当中原本第二小的元素,代替刚才的出栈元素成为了栈A的当前最小值。(备胎转正)
5.当调用getMin方法的时候,直接返回栈B的栈顶所指向的栈A对应元素即可。

二 简单实现例子

import java.util.Stack;

/**
 * 最小栈
 * 
 * @author lzn
 *
 */
public class LZN extends Stack<Integer> {

	// 最小值
	int minItem;
	// 用来存储曾经的最小值的下标
	Stack<Integer> indexStack = new Stack<>();
	// 第一次插入标记
	boolean isFirst = true;
	
	@Override
	public Integer push(Integer item) {
		// TODO Auto-generated method stub
		if (isFirst) {
			minItem = item;
			isFirst = false;
			indexStack.push(elementCount);
		}
		if (minItem > item) {
			minItem = item;
			indexStack.push(elementCount);
		}
		return super.push(item);
	}
	
	@Override
	public synchronized Integer pop() {
		// TODO Auto-generated method stub
		if (elementCount == 1) {
			isFirst = true;
		}
		if (elementCount == indexStack.peek() + 1) {
			indexStack.pop();
		}
		return super.pop();
	}
	
	public int getMinItem() {
		return (int) elementData[indexStack.peek()];
	}
	
	public static void main(String[] args) {
		LZN stack = new LZN();
		stack.push(10);
		System.out.println("stack.push(10): " + stack.getMinItem());
		stack.push(12);
		System.out.println("stack.push(12): " + stack.getMinItem());
		stack.push(9);
		System.out.println("stack.push(9): " + stack.getMinItem());
		stack.push(14);
		System.out.println("stack.push(14): " + stack.getMinItem());
		stack.push(7);
		System.out.println("stack.push(7): " + stack.getMinItem());
		stack.pop();
		System.out.println("stack.pop(): " + stack.getMinItem());
		stack.pop();
		System.out.println("stack.pop(): " + stack.getMinItem());
		stack.pop();
		System.out.println("stack.pop(): " + stack.getMinItem());
		stack.pop();
		System.out.println("stack.pop(): " + stack.getMinItem());
		stack.pop();
		System.out.println("stack.pop(): " + stack.getMinItem());
	}
}





发布了32 篇原创文章 · 获赞 9 · 访问量 6万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章