一刷劍指offer(21)——包含min函數的棧

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

看到這個問題,第一反應就是每次壓入一個新元素進棧時,將棧裏的所有元素排序,讓最小的元素位於棧頂,這樣就可以在O(1)時間得到最小元素了,但是這種思路不能保證最後壓入棧的元素能夠最先出棧,因此這個數據結構已經不是棧了。

思路:建立一個輔助棧,將每次的最小元素都保存在該棧中。

template<typename T> void StackWithMin<T>::push(const T& value)
{
    m_data.push(value);
    if(m_min.size()==0||value<m_min.top())
        m_min.push(value);
    else
        m_min.push(m_min.top());
}

template<typename T> void StackWithMin<T>::pop()
{
    //assert裏若是條件出錯,則停止運行
    assert(m_data.size()>0 && m_min.size()>0);
    m_data.pop();
    m_min.pop();
}

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

 

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