#include <deque> #include <iostream> #include <assert h=""> using namespace std; //类模板 创建栈 template <typename t=""> class CStackWithMin { public: CStackWithMin(){}; virtual ~CStackWithMin(){}; T& top(void); const T& top(void) const; void push(const T& value); void pop(void); const T& min(void) const; private: deque<t> m_data; deque<size_t> m_minIndex; }; //顶端元素 template <typename t=""> T& CStackWithMin<t>::top(void) { return m_data.back(); } //const成员函数 template <typename t=""> const T& CStackWithMin<t>::top(void) const { return m_data.back(); } //入栈 template <typename t=""> void CStackWithMin<t>::push(const T& value) { m_data.push_back(value); if (m_minIndex.size()==0) { m_minIndex.push_back(0); } //判断与先前的元素大小比较 else { if (value<m_data[m_minIndex.back()]) { m_minIndex.push_back(m_data.size()-1); } else { m_minIndex.push_back(m_minIndex.back()); } } } //出栈 template <typename t=""> void CStackWithMin<t>::pop(void) { if (m_data.back() > m_data[m_minIndex.back()]) { m_data[m_minIndex.back()]=m_data.back(); } m_data.pop_back(); m_minIndex.pop_back(); } //获取最小元素 template <typename t=""> const T& CStackWithMin<t>::min(void) const { assert(m_data.size()>0); assert(m_minIndex.size()>0); return m_data[m_minIndex.back()]; } int main() { CStackWithMin<int> stackData; stackData.push(3); stackData.push(4); stackData.push(2); cout<<stackData.min()<<" "; stackData.pop(); cout<<stackData.min()<<" "; stackData.pop(); cout<<stackData.min()<<" "; stackData.pop(); system("pause"); return 0; } </int></t></typename></t></typename></t></typename></t></typename></t></typename></size_t></t></typename></assert></iostream></deque>