【剑指Offer-举例让抽象问题形象化】面试题30:包含min函数的栈

题目描述

定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。

思路

一个比较自然的思路就是定义一个变量保存最小元素,当调用min()的时候返回该元素即可。但是该思路有一个问题,就是将当前最小元素返回后,下一个最小元素就不知道了。我们可以用一个辅助栈来保存入栈过程中的最小元素:

总结如下:
1、当入栈的时候,将入栈元素和辅助栈的栈顶元素相比较(辅助栈不为空的情况下),如果入栈元素较小,则将入栈元素压入数据栈和辅助栈;如果入栈元素较大,则只压入数据栈;如果辅助栈为空,则将数据压入数据栈和辅助栈;
2、当出栈的时候,将数据栈和辅助栈栈顶元素弹出;
3、当获取最小元素时,将辅助栈栈顶元素返回。
代码如下:

class Solution {
public:
    stack<int> s;    //数据栈
    stack<int> s_min;    //辅助栈
    void push(int value) {
        s.push(value);
        if(s_min.empty() || value<s_min.top()) // s_min.empty()要在前面
            s_min.push(value);
        else s_min.push(s_min.top());
    }
    void pop() {
        s.pop();
        s_min.pop();
    }
    int top() {
        return s.top();
    }
    int min() {
        return s_min.top();
    }
};
posted @ 2020-03-11 22:30  Flix  阅读(103)  评论(0编辑  收藏  举报