讀書筆記——漫畫算法(3) 最小棧

現在我們要求實現一種特殊的棧結構:最小棧;它滿足如下要求:

  • 1. 能夠在O(1)時間複雜度實現入棧/出棧操作
  • 2. 能夠在O(1)時間複雜度取出棧中最小的元素
/**
 * 最小棧的實現,此數據結構的實現必須滿足:
 * 1. 能夠在O(1)時間複雜度實現入棧/出棧操作
 * 2. 能夠在O(1)時間複雜度取出棧中最小的元素
 */
public interface MinStack {

    /**
     * O(1)時間複雜度取出棧中最小元素
     * @return
     */
    int getMin();

    /**
     * O(1)時間複雜度入棧
     * @param e
     */
    void push(int e);

    /**
     * O(1)時間複雜度出棧
     * @return
     */
    int pop();
}

我們藉助一個輔助棧,用來保存一段區間覆蓋上的最小值。這個 區間覆蓋 的含義需要細細體會。
最小棧的實現

public class MinStackImpl implements MinStack {

    private LinkedList<Integer> mainStack = new LinkedList<>();

    /**
     * 棧頂存放的是當前main的棧頂一段區間的最小值
     */
    private LinkedList<Integer> minStack = new LinkedList<>();

    @Override
    public int getMin() {
        if(minStack.isEmpty()) {
            throw new RuntimeException("Stack is empty...");
        }
        return minStack.peek();
    }

    @Override
    public void push(int e) {
        mainStack.push(e);
        if(minStack.isEmpty() || e <= minStack.peek()) {
            minStack.push(e);
        }
    }

    @Override
    public int pop() {
        int popElem = mainStack.pop();
        if(popElem == minStack.peek()) {
            minStack.pop();
        }
        return popElem;
    }

    public static void main(String[] args) {
        MinStack stack = new MinStackImpl();
        stack.push(4);
        stack.push(9);
        stack.push(7);
        stack.push(3);
        stack.push(8);
        stack.push(5);
        System.out.println(stack.getMin());
        stack.pop();
        stack.pop();
        stack.pop();
        System.out.println(stack.getMin());
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章