最小棧 —— 小灰的算法之旅讀書筆記

最小棧

實現一個棧,該棧帶有出棧(pop)、入棧(push)、取最小元素(getMin)3個方法

實現思路

使用一個主棧,存儲數據,一個輔助棧,存儲當前主棧元素的最小數

  • 主棧進棧時,如果輔助棧爲空,也進輔助棧,如果進棧元素小於輔助棧的棧頂元素,這個元素也進輔助棧中,否者只進主棧

  • 主棧出棧時,如果出棧元素等於輔助棧的棧頂元素,輔助棧的棧頂元素也出棧,否則只出主棧的元素

  • 查看最小元素的只需將輔助棧的元素取出查看

代碼實現

/**
 * 最小棧
 * @author hzj
 */
public class MinStack {

    private Stack<Integer> mainStack;
    private Stack<Integer> minStack;

    public MinStack() {
        mainStack = new Stack<Integer>();
        minStack = new Stack<Integer>();
    }

    public Stack<Integer> getMainStack() {
        return mainStack;
    }

    public void setMainStack(Stack<Integer> mainStack) {
        this.mainStack = mainStack;
    }

    public Stack<Integer> getMinStack() {
        return minStack;
    }

    public void setMinStack(Stack<Integer> minStack) {
        this.minStack = minStack;
    }

    /**
     * 進棧
     * @param element 進棧元素
     */
    public void push(int element) {
        //判斷最小棧的棧頂元素是否與進棧的元素大
        if (minStack.isEmpty() || minStack.peek() >= element) {
            minStack.push(element);
        }
        mainStack.push(element);

    }

    /**
     * 刪除棧頂的元素(出棧)
     * @return 棧爲空,返回null,否則直接返回
     */
    public Integer pop() {
        if (mainStack.isEmpty()) {
            return null;
        }
        //判斷出棧元素是否是棧中的最小值
        if (mainStack.peek().equals(minStack.peek())) {
            minStack.pop();
        }
        return mainStack.pop();
    }

    /**
     * 棧中的最小元素
     * @return 棧爲空返回null,否則返回主棧中的最小值
     */
    public Integer getMin() throws Exception {
        if (minStack.isEmpty()) {
            return null;
        }
        return minStack.peek();
    }
}

在出棧和查看棧頂元素的時候,需要判斷該棧是否爲空

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章