【剑指Offer】面试题21:包含min函数的栈

思路整理自剑指Offer


一:题目描述


定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。


二:解题思路


刚看时读题,并没有很清楚的理解题目的意思,看了解析后才明白,题目的意思可简单理解为:

一批数据入栈后,你可以获得这批数据的最小值,可以更改push(),pop(),top()函数和新建的min()函数实现


可以借助辅助栈,利用空间换时间,实现时间复杂度为O(1)的方法

以例子说明,加入将3,4,2,1压栈,求栈中元素最小值

定义一个辅助栈,与原始栈同时出栈入栈,区别在于辅助栈每次都把最小值压入栈,那么就可以保证,辅助栈栈顶一直都是最小元素。

三:代码实现

class Solution {
public:
    //需要自己定义栈,以及辅助栈
    stack<int> data;  //存放数据
    stack<int> min_data;  //存放data中的最小值,min_data大小等于data大小
    
    void push(int value) {
        //新元素入栈
        data.push(value);
        //如果min_data为空,新元素入栈
        if(min_data.size()==0)
            min_data.push(value);
        //如果min_data不为空否则,
        else{
            //value小于min_data栈顶元素,入栈,
            if(value<=min_data.top())
                min_data.push(value);
            else{
                //value小于min_data栈顶元素,说明当前min_data的栈顶元素是data中的最小值,再将min_data栈顶元素入栈
                 int topValue=min_data.top();
            	 min_data.push(topValue);
                     
            }
               
        }
    }
    //弹栈,获得栈顶元素,获得栈的最小值,都是对原始栈而言的
    void pop() {
        data.pop();
        min_data.pop();
    }
    int top() {
        return data.top();
    }
    int min() {
        return min_data.top();
    }
};


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章