[LeetCode] Min Stack

Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.

  • push(x) -- Push element x onto stack.
  • pop() -- Removes the element on top of the stack.
  • top() -- Get the top element.
  • getMin() -- Retrieve the minimum element in the stack.
class MinStack {

    stack<int> s;

    stack<int> s_min;

    

public:

    void push(int x) {

        s.push(x);

        if (s_min.empty() || x <= s_min.top()) {

            s_min.push(x);

        }

    }



    void pop() {

        if (s.top() == s_min.top()) {

            s_min.pop();

        }

        s.pop();

    }



    int top() {

        return s.top();

    }



    int getMin() {

        return s_min.top();

    }

};

老题了,用两个栈就可以了,后来想了个用链表的,可是爆内存了。唔唔唔。下面是链表的:

struct node {

    int val;

    node *next;

    node *min;

    node():val(-1), next(NULL), min(NULL){}

    node(int v):val(v), next(NULL), min(NULL){}

};



class MinStack {

    node head;

    

public:

    void push(int x) {

        node *top, *pre;

        if(head.next == NULL) {

            head.next = new node(x);

            top = head.next;

            top->min = top;

        } else {

            pre = head.next;

            head.next = new node(x);

            top = head.next;

            top->next = pre;

            if (x <= pre->min->val) {

                top->min = top;

            } else {

                top->min = pre->min;

            }

        }

    }



    void pop() {

        if (head.next == NULL) return;

        node *tmp = head.next;

        head.next = tmp->next;

        delete tmp;

    }



    int top() {

        return head.next->val;

    }



    int getMin() {

        return head.next->min->val;

    }

};

 

你可能感兴趣的:(LeetCode)