最小棧實現

一 思路

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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章