//============================================================================ // Name : StackWithMin.cpp // Author : 齐保元 // Version : // Copyright : Your copyright notice // Description : 带min函数的栈,采用两个deque模仿stack,一个存放所有的压栈值,另一个存放最小的index //============================================================================ #include <iostream> #include <cassert> #include <deque> using namespace std; template<typename _Tp> class CStackWithMin { public: CStackWithMin() {//默认构造函数 } virtual ~CStackWithMin(void) {//默认析构函数 } _Tp& top(void);//返回顶部元素 const _Tp& top(void) const;//返回的值不可以改和私有数据不被修改 void push(const _Tp& value);//压栈 void pop(void);//弹栈 const _Tp& min(void) const;//最小的元素 private: deque<_Tp> m_data;//存放元素的栈 deque<_Tp> m_minIndex;//最小元素的下标 }; //返回顶部元素 template<typename _Tp> _Tp& CStackWithMin<_Tp>::top() { return m_data.back(); } //const template<typename _Tp> const _Tp& CStackWithMin<_Tp>::top() const { return m_data.back(); } //压栈 template<typename _Tp> void CStackWithMin<_Tp>::push(const _Tp& value) { m_data.push_back(value);// 将值压入栈 if (m_minIndex.size() == 0) {//空 m_minIndex.push_back(0);// 下标0 } else { if (value < m_data[m_minIndex.back()]) {//小于栈顶 m_minIndex.push_back(m_data.size() - 1);//改变最小值的index } else { m_minIndex.push_back(m_minIndex.back());// 不变 } } } //出栈 template<typename _Tp> void CStackWithMin<_Tp>::pop(void) { m_data.pop_back(); m_minIndex.pop_back(); } //min template<typename _Tp> const _Tp& CStackWithMin<_Tp>::min(void) const { assert(m_data.size()>0); assert(m_minIndex.size()>0); return m_data[m_minIndex.back()]; } int main() { CStackWithMin<int> csw; csw.push(3); cout << csw.min() << endl; csw.push(4); cout << csw.min() << endl; csw.push(1); cout << csw.min() << endl; csw.push(2); cout << csw.min() << endl; csw.pop(); cout << csw.min() << endl; csw.pop(); cout << csw.min() << endl; csw.push(0); cout << csw.min() << endl; return 0; }