【劍指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();
    }
};


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