155. Min Stack

题目链接:https://leetcode.com/problems/min-stack/

【思路】

  • 使用两个栈,一个栈 dataStack 用于保存当前栈中的元素,和普通的栈没区别,另一个栈 minStack 用于保存每一步的最小值

  • push(x) :先将当前数据 x 压入 dataStack 栈中,然后再判断是否压入 minStack 栈中

    • 如果 minStack 为空,说明是第一次插入数据,那么 x 也压入 minStack 栈中
    • 如果 minStack 不为空,此时需要比较 x(即刚才压入 dataStack 栈中的数据) 和 minStack 栈栈顶的元素的大小关系
      • 如果 x 更小或者相等,那么将 x 压入 minStack 中
      • 如果 x 更大,那么不需要操作
  • pop() :先弹出 dataStack 中的栈顶元素 value,然后判断 minStack 是否需要弹出栈顶元素

    • 比较此时 minStack 的栈顶元素和 value 的大小,因为 minStack 栈顶的元素始终是 minStack 中的最小值,也是 dataStack 中的最小值,所以 value 只能大于或等于 minStack 的栈顶元素
      • 二者相等,意味着栈顶元素是上一次被压入的最小值,那么需要弹出 minStack 的栈顶元素
      • value 更大,minStack 不弹出栈顶元素
  • top() :返回 dataSatck 的栈顶元素

  • getMin() :弹出 minStack 栈顶元素

class MinStack {
public:
    MinStack() {
        
    }
    
    void push(int x) {
        dataStack.push(x);
        if(minStack.empty() || minStack.top() >= x) {
            minStack.push(x);
        }
    }
    
    void pop() {
        if(!minStack.empty() && minStack.top() == dataStack.top()) {
            minStack.pop();
        }
        dataStack.pop();
    }
    
    int top() {
        return dataStack.top();
    }
    
    int getMin() {
        return minStack.top();
    }
private:
    stack<int> dataStack,minStack;
    
};
posted @ 2020-04-12 16:23  nxgy  阅读(101)  评论(0编辑  收藏  举报