30 包含min函数的栈(举例让抽象问题具体化)

题目描述:

定义栈的数据结构(push/pop),请在该类型中实现一个能够得到栈中所含最小元素的min函数(三者的时间复杂度都应为O(1))。

 

测试用例:

 1)新压入栈的数字比之前的最小值大/小

 2)弹出的数字不是最小的元素/是最小的元素

 

解题思路:

1)借助辅助栈存储最小值,辅助栈顶一定都当前栈的最小值

class Solution {
public:
    void push(int value) {
        if(data.empty()){
            data.push(value);
            minValue.push(value);  // 是一样的A
        }else{ //不为空的时候要寻找最小值,添加到辅助栈中
            data.push(value);
            if(value<minValue.top())
                minValue.push(value);  // 是一样的A 
            else
                minValue.push(minValue.top());
        }
        /*
        比较简单的判断方法
        data.push(value);
        if(data.empty() || value<minValue.top()){
             minValue.push(value); 
        }else{
            minValue.push(minValue.top());
        }
        */
    }
    void pop() { //既要删除数据栈的栈顶元素,也要删除辅助栈的栈顶元素
        //assert(data.size()>0 && minValue.size()>0);
        if(data.empty())
            return;
        data.pop();//用判断栈为空么??
        minValue.pop();
    }
    int top() { //访问数据栈顶
        return data.top();
    }
    int min() { //访问辅助栈顶  考虑栈为空的时候
        //assert(data.size()>0 && minValue.size()>0);
        if(data.empty())
            return; //实际上应该报错
        return minValue.top();
    }
    
private:
    stack<int> data;
    stack<int> minValue;
};

2)使用key-value对存储

class Solution {
    typedef pair<int, int> pii;
    stack<pii> s;
public:
    void push(int value) {
        s.push(pii(value, ::min(value, s.empty() ? value : min()) )); //min()是自己定义的函数s.top().second;
    }
    void pop() {
        s.pop();
    }
    int top() {
        return s.top().first;
    }
    int min() {
        return s.top().second;
    }
};

  

  

 

posted @ 2019-03-04 19:59  GuoXinxin  阅读(128)  评论(0编辑  收藏  举报