问题描述

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.

分析

使用两个栈,一个存储值,一个存储最小值;在push数据x的时候直接将值push到值栈,然后判断当前最小值栈的top值是否大于等于x,然后大于等于,就将x push进最小值栈。这里一定要注意是大于等于,有等于的原因是因为pop操作的时候,要检查值栈与最小值栈的top值是否相等,若相等则同时pop,所以等于会保证相等的最小值也到了最小值栈里,pop时只会pop掉一个。

代码

class MinStack {
public:
	stack<int> data;
	stack<int> min_val;
    /** initialize your data structure here. */
    MinStack() {
        
    }
    
    void push(int x) {
    	data.push(x);
    	if(min_val.empty()||(!min_val.empty()&&min_val.top()>=x)) {
	    	min_val.push(x);
	    }
    }
    
    void pop() {
    	if(!data.empty()) {
	    	if(!min_val.empty()) {
	    		if(min_val.top() == data.top()) {
		    		min_val.pop();
		    	}
	    	}
	    	data.pop();
	    }
    }
    
    int top() {
    	if(data.empty()) return 0;
        return data.top();
    }
    
    int getMin() {
        if(min_val.empty()) return 0;
	 	return min_val.top();
    }
};