////////////////////////////////////////////////// ///////////////////////////////////
// 3. topic stack contains 21 Min function
template <typename TYPE> class CMinInStack { public: void Push(const TYPE& value); const TYPE Pop(); const TYPE& GetMinValue() const; private: stack<TYPE> m_stDataStack; stack<TYPE> m_stMinStack; }; template <typename TYPE> const TYPE& CMinInStack<TYPE>::GetMinValue() const { assert(!m_stDataStack.empty() && !m_stMinStack.empty()); return m_stMinStack.top(); } template <typename TYPE> const TYPE CMinInStack<TYPE>::Pop() { assert(!m_stDataStack.empty() && !m_stMinStack.empty()); TYPE value = m_stDataStack.top(); m_stDataStack.pop(); m_stMinStack.pop(); return value; } template <typename TYPE> void CMinInStack<TYPE>::Push(const TYPE& value) { // 1.向栈中添加元素 m_stDataStack.push(value); // 2.往辅助栈中添加最小元素 if (m_stMinStack.empty() || value < m_stMinStack.top()) { m_stMinStack.push(value); } else { m_stMinStack.push(m_stMinStack.top()); } } void MinInStackTestFunc() { cout << "\n\n --------------- MinInStackTestFunc Start -------------->" << endl; int aiArray[] = {3, 4, 5, 8, 9, 1, 4, 45, 89}; int iLen = sizeof(aiArray) / the sizeof ( int ); TRAVERSAL_ARRAY (aiArray, iLen); CMinInStack < int > stMinStack; for ( int I = 0 ; I <iLen; I ++ ) { stMinStack.Push (aiArray [I]); } the printf ( " minimum minimum stack elements:% d \ n- " , stMinStack.GetMinValue ()); the printf ( " minimum stack pop-up element:% d \ n- " , stMinStack.Pop ()); the printf ( " minimum stack pop-up element:% d \ n- " , stMinStack.Pop ()); the printf ( " minimum stack minimum element:% d \ n" , StMinStack.GetMinValue ()); the printf ( " minimum stack pop-up element: D% \ n- " , stMinStack.Pop ()); the printf ( " minimum stack minimum element: D% \ n- " , stMinStack.GetMinValue ()) ; the printf ( " minimum stack pop-up element: D% \ n- " , stMinStack.Pop ()); the printf ( " minimum stack pop-up element: D% \ n- " , stMinStack.Pop ()); the printf ( " minimum stack pop-up element :% D \ n- " , stMinStack.Pop ()); the printf ( " minimum stack minimum element: D% \ n- " , stMinStack.GetMinValue ()); COUT << "\n\n --------------- MinInStackTestFunc End -------------->" << endl; }