Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: snoopty en 24 Noviembre 2021, 08:03 am



Título: Código para mostrar el MENOR Nro en una Pila : Duda
Publicado por: snoopty en 24 Noviembre 2021, 08:03 am
/*
Cuando analizo la 1er ITERACIÓN ,LA ITERACiÓN 0, ME DÁ QUE
Top es 10 ( para mí es así a partir de lo explicado al lado de la línea arriba del " while " )
¿ Cómo puede ser esto ?
el if compara " if 10 < 10 " .... ESTO ES UNA INCOHERENCIA ( ? )

LAS SIGUIENTES ITERACIONES SON ENTENDIBLES YA QUE EN LA SGTE
3 ES MENOR QUE 10 , y se mantiene ese criterio hasta el final;
pero no comprendo lo de " if 10 < 10 "
*/
Código
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <stack>
  4. // PILAS " LIFO "
  5. // Es como una Pila de Platos =
  6. // PRIMERO sale ( o muestro ) el LAST último hasta llegar al
  7. //                               FIRST primero
  8. using namespace std;
  9.  
  10. stack <int> pila;
  11.  
  12. int menor;      // Declaro la Variable " menor" ya que
  13.                // estoy buscando el Dato de tipo INT Menor de toda la Pila
  14.  
  15. int main( )
  16. {
  17. pila.push(35);
  18. pila.push(40);
  19. pila.push(20);
  20. pila.push(3);
  21. pila.push(10);
  22.  
  23. // A DIFERENCIA DE LAS " COLAS " EN LAS " PILAS " para
  24. // mostrar el 1er Dato ( o sea, el 5to ) NO SE UTILIZA
  25. // ''' front ''' SINO SE UTILIZA ''' top '''
  26.  
  27. menor = pila.top(); // Esta Linea es NECESARIA puesto que cuando se evalue
  28.                    // " if ( pila.top() < menor ) ", si no definieramos previamente
  29.                    // que '' menor '' tome el valor del Dato que este AL COMIENZO DE LA PILA
  30.                    // " el IF " arrojaria '' 0 '' PUESTO QUE CUANDO AL PRINCIPIO DEFINIMOS
  31.                    // '' int menor '' COMO VARIABLE GLOBAL ( Ya que la definimos antes del
  32.                    // cuerpo de main ) ESTA SIEMPRE COMIENZA VALIENDO '' 0 ''
  33.                    // -- no hay ningun Nro menor que 0 dentro de la Pila --
  34. while ( pila.size() > 0 ) // pila.size() determina la cantidad de Elementos que
  35. {                         // se encuentran en la Pila
  36.  
  37. if ( pila.top() < menor )
  38. {
  39.  
  40. menor = pila.top();
  41.  
  42. }
  43. pila.pop();           // " BORRO " el Elemento actual para que el Bucle EVALUE otro
  44.                          // Elemento -- si no, seguiria siempre Evaluando a '' menor '' --
  45. }
  46.  
  47. cout << menor << endl;
  48.  
  49.  
  50. getch ();
  51. }
  52.  


Título: Re: Código para mostrar el MENOR Nro en una Pila : Duda
Publicado por: Eternal Idol en 24 Noviembre 2021, 10:27 am
Esta claro que tenes problemas con la logica, si te resulta imposible imaginar lo que va haciendo el programa entonces tenes que depurarlo linea por linea, que es lo ideal, o cuanto menos ayudarte generando una salida en pantalla.

Código
  1. cout << "menor " << menor << " pila.top " << pila.top() << endl;  
  2. if ( pila.top() < menor )
  3. {
  4.  cout << "CAMBIANDO menor, era " << menor << " sera " << pila.top() << endl;
  5.  menor = pila.top();
  6. }

El valor de retorno de top es 10, no por ese comentario, es 10 por el simple hecho de que en la linea 21 el ultimo llamado a push tuvo como parametro 10. ¿Como puede ser que? ¿Que menor sea 10? Se le asigna ese valor en la linea 27. No hay ninguna incoherencia y una vez asignado el resultado de pila.top a menor, linea 27, deberias llamar a pila.pop, esa primera comparacion que haces es futil.


Título: Re: Código para mostrar el MENOR Nro en una Pila : Duda
Publicado por: MAFUS en 24 Noviembre 2021, 10:30 am
Comparas y haces la pregunta:
¿Diez es menor que diez?
El programa te responde: No, por lo que no hago el cuerpo del if y ejecuto directamente pila.pop();
La siguiente iteración comparas y preguntas:
¿Tres es menor que diez?
El programa te responde: Sí, ejecuto el cuerpo del if y escribo en 'menor' el valor actual del top de la pila; después borro ese número del top.


Título: Re: Código para mostrar el MENOR Nro en una Pila : Duda
Publicado por: snoopty en 24 Noviembre 2021, 18:08 pm
Gracias ! .... sucede que pensaba que el algoritmo, por ser exigente " y por defecto " evaluaria el hecho de que
" 10 sea menor que 10 " como un error, por una
cuestión de comparar el mismo número sin que
haya una igualdad mediante.



Comparas y haces la pregunta:
¿Diez es menor que diez?
El programa te responde: No, por lo que no hago el cuerpo del if y ejecuto directamente pila.pop();
La siguiente iteración comparas y preguntas:
¿Tres es menor que diez?
El programa te responde: Sí, ejecuto el cuerpo del if y escribo en 'menor' el valor actual del top de la pila; después borro ese número del top.

Gracias, MAFUS : El siguiente Esquema Iterativo, qué te parece ? =
ITERACiÓN 0
Top es 10 ( 10 < " 10 menor " ) ( LA CONDICIÓN NO SE CUMPLE ) => menor =  10  && Se borró el 10( menor )
ITERACiÓN 1
Top es 3  ( 3  < " 10 menor " )                               => menor =   3  && Se borró el 10( pila.top )
ITERACiÓN 2
Top es 20 ( 20 <  " 3 menor " ) ( LA CONDICIÓN NO SE CUMPLE ) => menor =   3  && Se borró el 20
ITERACIÓN
Top es 40 ( 40 <  " 3 menor " ) ( LA CONDICIÓN NO SE CUMPLE ) => menor =   3  && Se borró el 40
ITERACiÓN 4
Top es 35 ( 35 <  " 3 menor " ) ( LA CONDICIÓN NO SE CUMPLE ) => menor =   3  && Se borró el 35


Título: Re: Código para mostrar el MENOR Nro en una Pila : Duda
Publicado por: Eternal Idol en 25 Noviembre 2021, 08:33 am
Gracias, MAFUS : El siguiente Esquema Iterativo, qué te parece ? =
ITERACiÓN 0
Top es 10 ( 10 < " 10 menor " ) ( LA CONDICIÓN NO SE CUMPLE ) => menor =  10  && Se borró el 10( menor )
ITERACiÓN 1
Top es 3  ( 3  < " 10 menor " )                               => menor =   3  && Se borró el 10( pila.top )
ITERACiÓN 2
Top es 20 ( 20 <  " 3 menor " ) ( LA CONDICIÓN NO SE CUMPLE ) => menor =   3  && Se borró el 20
ITERACIÓN
Top es 40 ( 40 <  " 3 menor " ) ( LA CONDICIÓN NO SE CUMPLE ) => menor =   3  && Se borró el 40
ITERACiÓN 4
Top es 35 ( 35 <  " 3 menor " ) ( LA CONDICIÓN NO SE CUMPLE ) => menor =   3  && Se borró el 35



Esta mal en la segunda linea, lo que se borra de la pila es 3, no 10. Y en la primera linea no se borra menor, se borra siempre de la pila, coincide su valor con menor por obvias razones, por eso te dije antes que seria mas logico llamar a pop antes de empezar el bucle en lugar de comparar futilmente menor (que sabemos que es igual al resultado de top) con el resultado de top.