elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Pila en C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Pila en C++  (Leído 6,563 veces)
clockerino

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Pila en C++
« 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".

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


« Última modificación: 31 Octubre 2022, 20:50 pm por K-YreX » En línea

dario01dr

Desconectado Desconectado

Mensajes: 17


Ver Perfil
Re: Pila en C++
« Respuesta #1 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/


En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Pila en C++
« Respuesta #2 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:
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
dijsktra

Desconectado Desconectado

Mensajes: 110


Mr Edsger Dijsktra (Tribute to)


Ver Perfil
Re: Pila en C++
« Respuesta #3 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:




En línea

Si la depuración es el proceso de eliminar fallos en el software, entonces programar debe ser el proceso de ponerlos dentro. (Edsger Dijsktra)
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
La pila
Electrónica
Sardi 1 4,550 Último mensaje 6 Noviembre 2003, 04:22 am
por Meta
Pila en C++
Programación C/C++
Norochii 1 5,991 Último mensaje 25 Mayo 2011, 20:24 pm
por Acermax
Una pila en C
Programación C/C++
Dark Invader 4 3,972 Último mensaje 25 Junio 2011, 19:40 pm
por Dark Invader
[C-ASM] Pila
Programación C/C++
GGZ 0 1,517 Último mensaje 21 Noviembre 2016, 01:58 am
por GGZ
que es una pila?
Programación General
TR NOvato 3 2,474 Último mensaje 30 Marzo 2017, 02:09 am
por TR NOvato
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines