

class funcStack{
public:
    virtual char operator[] (int);
    virtual int size(int);
    virtual char operator() ();
    virtual int size();
};

class fpush:public funcStack{
    funcStack * _from;
    char _c;
public:
    char operator[] (int i);
    int size(int i);
    fpush(funcStack *, char);
    fpush(char);
    char operator() ();
    int size();
};

class fpop:public funcStack{
    funcStack * _from;
public:
    char operator[] (int i);
    int size(int i);
    fpop(funcStack *);
    char operator() ();
    int size();
};

//base
char funcStack::operator[] (int i)
{
    return 0;
}

char funcStack::operator() ()
{
    return 0;
}

int funcStack::size(int i)
{
    return 0;
}

int funcStack::size()
{
    return 0;
}

//push
fpush::fpush(funcStack * from, char c)
{
    _from = from;
    _c =c;
}

fpush::fpush(char c)
{
    _from = 0;
    _c = c;
}

char fpush::operator()()
{
    return _c;
}

char fpush::operator[](int i)
{
    if (i && _from)
        return (*_from)[i-1];
    return _c;
}

int fpush::size()
{
    if (_from)
        return _from->size(1);
    return 1;
}

int fpush::size(int i)
{
    if (_from)
        return _from->size(i+1);
    return 1;
}

//pop
fpop::fpop(funcStack * from)
{
    _from = from;
}

char fpop::operator()()
{
    return (*_from)[1];
}

char fpop::operator[](int i)
{
    return (*_from)[i+1];
}

int fpop::size()
{
    return _from->size(-1);
}

int fpop::size(int i)
{
    return _from->size(i-1);
}
