#include<iostream> #include<stack> using namespace std; template <typename T> class StackWithMin { public: StackWithMin(void); ~StackWithMin(void); void push(const T& node); void pop(); T& min const(); private: stack<T> m_data; stack<T> m_min; }; template <typename T> void StackWithMin::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(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(); }