Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: clockerino en 30 Octubre 2022, 01:28 am



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 ;-)
Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3. using namespace std;
  4.  
  5.  
  6.  
  7. struct pila{
  8. int elemento;
  9. pila *enlace;
  10. };
  11.  
  12. void push( );
  13. void pop();
  14. void display();
  15. void liberar();
  16.  
  17.  
  18. pila *p_aux;
  19. pila *p_pila=NULL;
  20.  
  21. int main(){
  22.  
  23. int opcion;
  24.  
  25. cout<<"Pila de tipo dinamica"<<endl;
  26. cout<<"\tMenu\n";
  27. cout<<"1)Insertar nuevo elemento a la pila"<<endl;
  28. cout<<"2)Sacar elemento de la pila"<<endl;
  29. cout<<"3)Mostrar los elementos de la pila"<<endl;
  30. cout<<"4)Liberar memoria"<<endl;
  31. cout<<"5)Salir\n\n";
  32.  
  33. do{
  34.  
  35. cout<<"Escoga un opcion:"<<endl;
  36. cin>>opcion;
  37. switch(opcion){
  38.  
  39. case 1:
  40.  
  41. push();break;
  42. case 2:
  43. pop();break;
  44. case 3:
  45. display();break;
  46. case 4:
  47. liberar();break;
  48. case 5:
  49. cout<<"Saliendo del programa";break;
  50. default: cout<<"Opcion no valida";
  51.  
  52. }
  53. }while(opcion!=5);system("cls");
  54.  
  55.  
  56.  
  57. return 0;
  58. }
  59.  
  60.  
  61. void push(){
  62. p_aux=new pila;
  63. cout<<"\tDigite un numero"<<endl;
  64. cin>>p_aux->elemento;
  65. p_aux->enlace=p_pila;
  66. p_pila=p_aux;
  67. }
  68.  
  69. void pop(){
  70. if(p_pila==NULL){
  71. cout<<"\tLa pila esta vacia"<<endl;}
  72.  
  73. else{
  74.     p_pila=p_aux->enlace;
  75.     cout<<"\tElemento "<<p_aux->elemento<<" sacado de la pila con exito"<<endl;
  76.     delete p_aux;
  77.     pila *p_aux=p_pila;}
  78.  
  79.  }
  80.  
  81.  
  82. void display(){
  83.  
  84. if(p_pila==NULL)
  85. cout<<"\tNo hay elementos que mostrar en la pila"<<endl;
  86. else{
  87. cout<<"\tMostrando elementos"<<endl;
  88. do{
  89.  
  90. cout<<"\t"<<p_aux->elemento<<endl;
  91. p_aux=p_aux->enlace;
  92. }while(p_aux!=NULL);}
  93. p_aux=p_pila;
  94.  
  95. }
  96.  
  97. void liberar(){
  98.  
  99. if(p_pila!=NULL){
  100. cout<<"\tLiberando la memoria"<<endl;
  101.  
  102. while(p_pila!=NULL){
  103.  
  104. p_pila=p_aux->enlace;
  105. delete p_aux;
  106. pila *p_aux=p_pila;}
  107.  
  108. }
  109. }

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.

Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3. using namespace std;
  4.  
  5.  
  6.  
  7. typedef struct pila {
  8. int elemento;
  9. pila* enlace;
  10. } pila_t, *pila_tp;
  11.  
  12. void push(const int n);
  13. int pop();
  14. int empty();
  15. void display();
  16. void liberar();
  17.  
  18.  
  19. static pila* p_pila = NULL;
  20.  
  21. int main() {
  22.  
  23. int opcion;
  24.  
  25. cout << "Pila de tipo dinamica" << endl;
  26. cout << "\tMenu\n";
  27. cout << "1)Insertar nuevo elemento a la pila" << endl;
  28. cout << "2)Sacar elemento de la pila" << endl;
  29. cout << "3)Mostrar los elementos de la pila" << endl;
  30. cout << "4)Liberar memoria" << endl;
  31. cout << "5)Salir\n\n";
  32.  
  33. do {
  34.  
  35. cout << "Escoga un opcion: " ;
  36. cin >> opcion;
  37. switch (opcion) {
  38.  
  39. case 1:
  40. int n;
  41. cout << "Numero a insertar ";
  42. cin >> n;
  43. push(n); break;
  44. case 2:
  45. if (!empty())
  46. cout << pop() << endl;
  47. else
  48. cout << "Pila vacia" << endl
  49. ;
  50. break;
  51. case 3:
  52. display(); break;
  53. case 4:
  54. liberar(); break;
  55. case 5:
  56. cout << "Saliendo del programa"; break;
  57. default: cout << "Opcion no valida";
  58.  
  59. }
  60. } while (opcion != 5);
  61.  
  62. return 0;
  63. }
  64.  
  65. int empty() {
  66. return p_pila == NULL;
  67. }
  68.  
  69.  
  70. void push(const int n) {
  71. pila_tp p_aux = new pila;
  72.    p_aux->elemento=n;
  73. p_aux->enlace = p_pila;
  74. p_pila = p_aux;
  75. }
  76.  
  77. int pop() {
  78. /* Take control of p_aux!*/
  79. const int n = p_pila->elemento;
  80. pila_tp p_aux = p_pila;
  81. p_pila = p_aux->enlace;
  82. delete p_aux;
  83. return n;
  84. }
  85.  
  86.  
  87. /* I/O operation */
  88. void display() {
  89. pila_tp p_aux = p_pila;
  90. while (p_aux != NULL)
  91. {
  92. cout << "\t" << p_aux->elemento << endl;
  93. p_aux = p_aux->enlace;
  94. }
  95. }
  96.  
  97. void liberar() {
  98. pila_tp p_aux = p_pila;
  99. while (p_aux!= NULL) {
  100. const pila_tp p_next = p_aux->enlace;
  101. delete p_aux;
  102. p_aux = p_next;
  103. }
  104. p_pila = NULL;
  105.  
  106. }
  107.  
  108.  
  109.  
  110.  


Resultado
Código:

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: