包含min函數的棧(劍指offer 面試題30)

題目描述:

定義棧的數據結構,請在該類型中實現一個能夠得到棧中所含最小元素的min函數(時間複雜度應爲O(1))。

解題思路:

該題注意利用舉例的方法使抽象的問題具體化;題目中是可以在O(1)複雜度的情況下,獲取棧中所有元素的最小元素,所以不能對棧中的數據進行排序操作,而且排序操作破壞了棧先進後出,後進先出的特點;綜上考慮得開闢輔助空間。如果輔助空間僅保存當前棧中最小元素,那麼在數據棧進行彈棧操作後,不知道該元素是否是最小元素;所以得記錄壓入數據棧中每個棧長度對應的最小值,輔助棧與數據棧一樣長,輔助棧的第i個元素表示數據棧中第i個元素到棧底元素之間所有元素的最小元素。輔助棧的實現只需要在每次對數據棧進行push時,比較當前push的元素與輔助棧的棧頂元素的大小,在輔助棧中壓入較小的元素。

數據棧用m_data表示,輔助棧用m_min表示;assert表示不滿足其括號中的條件的時候中斷運行程序。

實現代碼:

#include <assert.h>
class Solution {
public:
    stack<int> m_data,m_min;//m_data數據棧,m_min最小輔助棧
    void push(int value) {
        m_data.push(value);
        if(m_min.size() == 0 || m_min.top() > value)
            m_min.push(value);
        else
            m_min.push(m_min.top());
    }
    void pop() {
        assert(m_data.size() > 0 && m_min.size() > 0);
        m_data.pop();
        m_min.pop();
            
    }
    int top() {
        assert(m_data.size() > 0);
        return m_data.top();
    }
    int min() {
        assert(m_data.size() > 0 && m_min.size() > 0);
        return m_min.top();
    }
};

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