題目:
定義棧的數據結構,請在該類型中實現一個能夠得到棧的最小元素的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();
}