天天看點

【算法題目】包含min函數的棧

  題目來源:《劍指offer》面試題21

  題目:定義棧的資料結構,請在該類型中實作一個能夠得到棧的最小元素的min函數。在該棧中,調用min,push以及pop的時間複雜度都是O(1)。

  分析:假設用于存儲主要資料的棧稱為資料棧。我們增加一個輔助棧,它的棧頂元素永遠是目前資料棧中元素的最小值。當插入元素時,如果插入的元素比輔助棧棧頂還小,那麼就往輔助棧壓入這個資料作為目前資料棧新的最小值。如果大的話,再次壓入輔助棧的棧頂元素,表明來了一個新元素後,最小值沒有變換。

//m_data是資料棧,m_min是輔助棧
template<typename T> void StackWithMin<T>::push(const T& value) {
    m_data.push(value);

    if (m_min.empty() || value < m_min.top())
        m_min.push(data);
    else
        m_min.push(m_min.top());
}

template<typename T> void StackWithMin<T>::pop(const T& value) {
    m_min.pop();
    m_data.pop();
}

template<typename T> const T& StackWithMin<T>::min() const {
    return m_min.top();
}