Título: Pila en C++
Publicado por: clockerino en 30 Octubre 2022, 01:28 am
Buen dia gente, tengo un problemita mi codigo para representar una pila.Cuando lo ejecuto parece que funciona bien, el problema veine cuando saco un elemento de la pila y posteriormenete quiero mostrar los elementos que quedan con la funcion "display". (https://i.ibb.co/cc6tSFL/pila.png) Como ven, el dato que saque de la pila sigue Imprimiéndose en pantalla, peo cuando vuelvo a repetr la opcion entonces ya no aparece, sopungo que tiene que ver el ciclo while de la funcion, pero no logro entender por que sucede.Tambien tengo problemas con la funcion encargada de liberar la memoria. Si alguien me pudiera ayudar a clarar la logica de estos temas se lo agrdeceria ;-) #include <iostream> #include <stdlib.h> using namespace std; struct pila{ int elemento; pila *enlace; }; void push( ); void pop(); void display(); void liberar(); pila *p_aux; pila *p_pila=NULL; int main(){ int opcion; cout<<"Pila de tipo dinamica"<<endl; cout<<"\tMenu\n"; cout<<"1)Insertar nuevo elemento a la pila"<<endl; cout<<"2)Sacar elemento de la pila"<<endl; cout<<"3)Mostrar los elementos de la pila"<<endl; cout<<"4)Liberar memoria"<<endl; cout<<"5)Salir\n\n"; do{ cout<<"Escoga un opcion:"<<endl; cin>>opcion; switch(opcion){ case 1: push();break; case 2: pop();break; case 3: display();break; case 4: liberar();break; case 5: cout<<"Saliendo del programa";break; default: cout<<"Opcion no valida"; } }while(opcion!=5);system("cls"); return 0; } void push(){ p_aux=new pila; cout<<"\tDigite un numero"<<endl; cin>>p_aux->elemento; p_aux->enlace=p_pila; p_pila=p_aux; } void pop(){ if(p_pila==NULL){ cout<<"\tLa pila esta vacia"<<endl;} else{ p_pila=p_aux->enlace; cout<<"\tElemento "<<p_aux->elemento<<" sacado de la pila con exito"<<endl; delete p_aux; pila *p_aux=p_pila;} } void display(){ if(p_pila==NULL) cout<<"\tNo hay elementos que mostrar en la pila"<<endl; else{ cout<<"\tMostrando elementos"<<endl; do{ cout<<"\t"<<p_aux->elemento<<endl; p_aux=p_aux->enlace; }while(p_aux!=NULL);} p_aux=p_pila; } void liberar(){ if(p_pila!=NULL){ cout<<"\tLiberando la memoria"<<endl; while(p_pila!=NULL){ p_pila=p_aux->enlace; delete p_aux; pila *p_aux=p_pila;} } }
MOD: El código debe ir entre etiquetas de Código GeSHi
Título: Re: Pila en C++
Publicado por: dario01dr en 30 Octubre 2022, 03:10 am
Hola, C++ ya tiene la estructura pilas definidas. Lee este enlace, espero te sirva. Salu2.
https://www.geeksforgeeks.org/stack-in-cpp-stl/ (https://www.geeksforgeeks.org/stack-in-cpp-stl/)
Título: Re: Pila en C++
Publicado por: K-YreX en 1 Noviembre 2022, 08:02 am
En las funciones pop() y liberar() estás creando un puntero nuevo llamado p_aux en vez de usar el original que está declarado globalmente. Esto es lo que está produciendo errores de acceso a memoria... :rolleyes:
Título: Re: Pila en C++
Publicado por: dijsktra en 6 Noviembre 2022, 00:15 am
Pfff... Hay muchos errores. Es posible que entre tanto código pierdas la perspectiva. - Separa la interacción (cin, cout) de la implementación de la pila
- No uses variables globales. Tiene un pase que quieras hacer una pila "singleton", o sea, que no puedas más que declarar una valor de pila (p_pila), pero nunca la variable auxiliar. Si no, corres el riesgo de asumir valores que en realidad no tiene
Siguiendo un poco "tu voz", esto es lo que he enmendado. #include <iostream> #include <stdlib.h> using namespace std; typedef struct pila { int elemento; pila* enlace; } pila_t, *pila_tp; void push(const int n); int pop(); int empty(); void display(); void liberar(); static pila* p_pila = NULL; int main() { int opcion; cout << "Pila de tipo dinamica" << endl; cout << "\tMenu\n"; cout << "1)Insertar nuevo elemento a la pila" << endl; cout << "2)Sacar elemento de la pila" << endl; cout << "3)Mostrar los elementos de la pila" << endl; cout << "4)Liberar memoria" << endl; cout << "5)Salir\n\n"; do { cout << "Escoga un opcion: " ; cin >> opcion; switch (opcion) { case 1: int n; cout << "Numero a insertar "; cin >> n; push(n); break; case 2: if (!empty()) cout << pop() << endl; else cout << "Pila vacia" << endl ; break; case 3: display(); break; case 4: liberar(); break; case 5: cout << "Saliendo del programa"; break; default: cout << "Opcion no valida"; } } while (opcion != 5); return 0; } int empty() { return p_pila == NULL; } void push(const int n) { pila_tp p_aux = new pila; p_aux->elemento=n; p_aux->enlace = p_pila; p_pila = p_aux; } int pop() { /* Take control of p_aux!*/ const int n = p_pila->elemento; pila_tp p_aux = p_pila; p_pila = p_aux->enlace; delete p_aux; return n; } /* I/O operation */ void display() { pila_tp p_aux = p_pila; while (p_aux != NULL) { cout << "\t" << p_aux->elemento << endl; p_aux = p_aux->enlace; } } void liberar() { pila_tp p_aux = p_pila; while (p_aux!= NULL) { const pila_tp p_next = p_aux->enlace; delete p_aux; p_aux = p_next; } p_pila = NULL; }
Resultado Pila de tipo dinamica Menu 1)Insertar nuevo elemento a la pila 2)Sacar elemento de la pila 3)Mostrar los elementos de la pila 4)Liberar memoria 5)Salir
Escoga un opcion: 1 Numero a insertar 10 Escoga un opcion: 1 Numero a insertar 13 Escoga un opcion: 3 13 10 Escoga un opcion: 1 Numero a insertar 256 Escoga un opcion: 3 256 13 10 Escoga un opcion: 2 256 Escoga un opcion: 3 13 10 Escoga un opcion:
|