#include<iostream>
#include<stack>
#include<assert.h>
using namespace std;
template<typename T>
class StackWithMin
{
public:
void push(const T& value );
void pop();
const T& min() const;
private:
stack<T> m_data;
stack<T> m_min;
};
template<typename T>
void StackWithMin<T>::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();
}
void main()
{
int a[5]={2,3,5,0,1};
StackWithMin<int> stackMin;
for(int i=0; i<5; i++)
{
stackMin.push(a[i]);
}
for(int i=0; i<5; i++)
{
cout<<stackMin.min()<<endl;
stackMin.pop();
}
system("pause");
}