1. 程式人生 > >棧實現:入棧、出棧、取最小元素的時間複雜度都是O(1)。

棧實現:入棧、出棧、取最小元素的時間複雜度都是O(1)。

場景:

實現一個棧,帶有出棧(pop),入棧(push),取最小元素(getMin)三個方法。要保證這三個方法的時間複雜度都是O(1)。

方法一:

  • 設兩個棧A/B,A:存放原始資料,B:棧頂為最小元素,其餘為最小元素的備胎;
  • 入棧:
    (1) 當第一個元素進入棧A時,索引“0”進入棧B。索引“0”所指即為棧A的當前最小值;
    (2) 每當新元素進入棧A時,將新元素與B的棧頂元素(即棧A當前最小值)對比。若新元素小於B的棧頂元素,則新元素的下標進入棧B;
  • 出棧
    當A有出棧時,若A棧頂元素的索引為B的棧頂元素(即,出棧元素為A的最小值),則B的棧頂元素出棧。出棧後,B的棧頂元素指向A原本第二小元素,即A當前最小元素。
  • 取最小元素。
    B的棧頂所指向的即為棧A的最小元素。

    這裡寫圖片描述

方法二:
使用帶有尾指標的單鏈表。

  • 連結串列結點結構

    class Node
    {
        int value;
        int min;
        Node *next;
    
        public Node(int value, int min)
        {
            this.value = value;
            this.min = min;
        }
    }
  • 棧操作

    class MinStack
    {
        Node *top;
        public MinStack(){ }
    
        // 入棧
        public
    void push(int value) { if (top == null) { top = new Node(value, value); } else { Node* e = new Node(value, Math.min(value, top.min)); e->next = top; top = e; } } // 出棧 int pop() { if
    (top == null) { throw new Exception("Stack is empty"); } int result = top->value; Node* temp = top; top = top->next ; free(temp ); return result; } public int getMin() { return top->min; } }