面试题21 包含min函数的栈

#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;
}

 

posted @ 2015-05-17 22:03  crazyzhping  阅读(139)  评论(0)    收藏  举报