none
Rellenar una pila con un iterador

    Question

  • Buenas, es mi primera vez aqui en estos foros.

    Mi consulta es si puedo rellenar una pila con un iterador.

    Les abjunto el codigo:

     

    #include<iostream>

    using namespace std;

     

    class Pila{

    private:

    int vectorPila[10];

    int top;

    public:

    Pila(){top=-1;}

    void push(int in){vectorPila[++top]=in;}//Ingresa elemento

    int pop(){return vectorPila[top--];}//Retorna elemento

    bool isEmpty(){return top==-1;}//Esta vacio

    class Iterador{

    private:

    const Pila *ptrPila;

    int indice;

    public:

    Iterador(const Pila *s){ptrPila=s;}

    void first(){indice=0;}

    void next(){indice++;}

    bool isDone(){return indice==ptrPila->top+1;}

    int currentItem(){return ptrPila->vectorPila[indice];}

    };

    Iterador* creaIterador()const{return new Iterador(this);}

    };

    //Metodos que no pertenecen a ninguna clase

    bool operator==(const Pila& l, const Pila& r){//Si me llegan dos pilas tengo que ver si son iguales, devuelve un bool

    Pila::Iterador* itl=/*new //No hace falta*/ l.creaIterador();//Para la primera pila, itl(Iterator Left)

    Pila::Iterador* itr=/*new //No hace falta*/ r.creaIterador();//Para la segunda pila, itr(Iterator Right)

        for(itl->first(),itr->first();! itl->isDone();itr->next(),itl->next())

    if(itl->currentItem()!=itr->currentItem())

    break;

    bool ans=itl->isDone() && itr->isDone();

    delete itr;

    delete itl;

    return ans;

    }

     

    void main(){

    //Prueba sobre la pila

    Pila s1;

    for(int i=1;i<7;i++)

    s1.push(i+5);

    /*for(int j=0;j<7;j++)

    cout<<"--->"<<s1.pop()<<endl;*/

    //Creacion de Pila

    Pila s2(s1),s3(s1),s4(s1),s5(s1);//Como hacer para que esas pilas sean iguales

    s3.pop();

    s5.pop();

    s4.push(54);

    //Comparacion

    cout<<"S1==S2? "<<(s1==s2)<<endl;

    cout<<"S1==S3? "<<(s1==s3)<<endl;

    cout<<"S1==S4? "<<(s1==s4)<<endl;

    cout<<"S1==S5? "<<(s1==s5)<<endl;

    /*

    //Prueba                                   //Malos 

    if(1)                                      // 0

    cout<<"Bien"<<endl;                    //NULL

    else                                       //'10'

    cout<<"Mal"<<endl;

    //Prueba

    if(-15)

    cout<<"Bien"<<endl;

    else

    cout<<"Mal"<<endl;

    */

    //Pause

    //Crear una pila de 6 valores

    Pila p;

    /*for(int i=0;i<9;i++)----------------------------------------------------------------ERROR

    p.push(i*i);*/

    //Crear un iterador para esa pila

    Pila::Iterador* iter = p.creaIterador();

    //Llenar la pila

    int z=0;

    for(iter->first(); ! iter->isDone(); iter->next()){

    p.push(z*2);

    z++;

    }

    //Imprimir la pila

    for(iter->first(); ! iter->isDone(); iter->next())

    cout<<"--->"<<p.pop()<<endl;

    system("pause");

    }

     

     

    Tuesday, March 29, 2011 4:52 PM

All replies

  • El problema que tienes es que estás usando un puntero a una pila dentro de la clase iterador, pero no le asignas memoria, por lo que estás escribiendo en memoria sin reservar... Funciona hasta que llegues a donde no debas y toques algo que no debas y entonces peta todo.

    Tienes que definirte un constructor y un destructor para la clase Iterador, y asignar con new y borrar con delete (respectivamente) la pila (si la quieres en forma de puntero, claro).


    MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    Monday, April 11, 2011 2:39 PM
    Moderator