题目21 包含Min函数的栈
/////////////////////////////////////////////////////////////////////////////////////
// 3. 题目21 包含Min函数的栈
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) / sizeof(int); TRAVERSAL_ARRAY(aiArray, iLen); CMinInStack<int> stMinStack; for (int i = 0; i < iLen; i++) { stMinStack.Push(aiArray[i]); } printf("最小栈 最小元素: %d\n", stMinStack.GetMinValue()); printf("最小栈 弹出元素: %d\n", stMinStack.Pop()); printf("最小栈 弹出元素: %d\n", stMinStack.Pop()); printf("最小栈 最小元素: %d\n", stMinStack.GetMinValue()); printf("最小栈 弹出元素: %d\n", stMinStack.Pop()); printf("最小栈 最小元素: %d\n", stMinStack.GetMinValue()); printf("最小栈 弹出元素: %d\n", stMinStack.Pop()); printf("最小栈 弹出元素: %d\n", stMinStack.Pop()); printf("最小栈 弹出元素: %d\n", stMinStack.Pop()); printf("最小栈 最小元素: %d\n", stMinStack.GetMinValue()); cout << "\n\n --------------- MinInStackTestFunc End -------------->" << endl; }