#include<iostream>
#include<vector>
using namespace std;
class MinStack
{
public:
class Data
{
public:
Data( int a = 0 , int b = -1 ): data(a) , cur( b){}
int data;
int cur;
};
friend class Data;
public:
MinStack():mincur(-1), minvalue( 1<<30 ) {}
void push( int data );
void pop();
int min();
private:
vector<Data> m_data;
int mincur;
int minvalue;
typedef vector<Data>::iterator Iter ;
};
void MinStack::push( int data )
{
if( mincur == -1 )
{
Data temp( data);
mincur = m_data.size();
minvalue = data;
m_data.push_back( temp );
}
else if( data < minvalue )
{
Data temp( data , mincur );
minvalue = data ;
mincur = m_data.size() ;
m_data.push_back( temp );
}
else
{
Data temp( data );
m_data.push_back( temp );
}
}
void MinStack::pop()
{
if( mincur == m_data.size() -1 )
{
mincur = m_data[m_data.size() - 1].cur;
minvalue = m_data[ mincur ].data;
m_data.pop_back();
}
else
{
m_data.pop_back();
}
}
int MinStack::min()
{
if( mincur != -1 )
return minvalue ;
else
return -1<<30;
}
void printmin(MinStack &s)
{
cout << s.min() << endl;
}
void popmin(MinStack &s)
{
s.pop();
printmin( s );
}
int main()
{
MinStack s;
s.push( 3 );
printmin( s );
s.push( 10 );
printmin( s );
s.push( -5 );
printmin( s );
s.push( 12 );
printmin( s );
s.push( -8 );
printmin( s );
s.push( -2 );
printmin( s );
cout<< " pop out " << endl;
popmin(s);
popmin(s);
popmin(s);
popmin(s);
popmin(s);
popmin(s);
return 0;
}