comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

Resolver expresiones con pilas

  • 6 Respuestas
  • 3394 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Juan

  • *
  • Underc0der
  • Mensajes: 159
  • Actividad:
    0%
  • Reputación 0
  • Ex-Drinky
    • Ver Perfil
« en: Noviembre 12, 2013, 08:41:11 pm »
Resuelve expresiones como 1+1+1+1 , 2*5(3+4), (5*2)+(5*3). No resolvera numeros de dos o mas caracteres, aunque modificando un poco el codigo se puede conseguir :)

un saludo!

Código: C
  1. // convierte expresion INFIJA en POSTFIJA y evalua expresiones POSTFIJAS
  2. // programado por Juan fary (mDrinky) drinky.94@hotmail.com
  3. // compilado con MingW y Code::Blocks
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8.  
  9. typedef struct Dato
  10. {
  11.     char caracter;
  12.     struct Dato * Siguiente;
  13. }_Dato;
  14.  
  15. typedef _Dato * ptrDato;
  16.  
  17. void push(ptrDato * Pila,char caracter);
  18. char pop(ptrDato * Pila);
  19. int Prioridad(char Op1,char Op2);
  20. char * PostFija(char * Cadena);
  21. int Evaluar(char * Expresion);
  22.  
  23. int main()
  24. {
  25.     char * cadena = "5*3+8*5";
  26.  
  27.     char * Expresion = PostFija(cadena);
  28.  
  29.     No tienes permisos para ver links. Registrate o Entra con tu cuenta("POSTFIJA: %s\n",Expresion);
  30.  
  31.     No tienes permisos para ver links. Registrate o Entra con tu cuenta("Resultado de la operacion: %i",Evaluar(Expresion));
  32.  
  33.     return 0;
  34. }
  35.  
  36. int Evaluar(char * Expresion)
  37. {
  38.     ptrDato Pila = NULL;
  39.     int num1 = 0,num2 = 0,i = 0, Resultado = 0;
  40.  
  41.     while (Expresion[i] != '\0')
  42.     {
  43.         if (Expresion[i] != '*' && Expresion[i] != '/' && Expresion[i] != '+' && Expresion[i] != '-')
  44.         {
  45.             push(&Pila,Expresion[i]);
  46.         }else{
  47.             num1 = (pop(&Pila)-0x30);
  48.             num2 = (pop(&Pila)-0x30);
  49.  
  50.             switch (Expresion[i])
  51.             {
  52.                 case '*':
  53.                     Resultado = ((num1*num2));
  54.                     break;
  55.  
  56.                 case '/':
  57.                     Resultado = ((num1/num2));
  58.                     break;
  59.  
  60.                 case '+':
  61.                     Resultado = ((num1+num2));
  62.                     break;
  63.  
  64.                 case '-':
  65.                     Resultado = ((num1-num2));
  66.                     break;
  67.             }
  68.             push (&Pila,(Resultado+0x30));
  69.         }
  70.         i++;
  71.     }
  72.     return Resultado;
  73. }
  74.  
  75. char * PostFija(char * cadena)
  76. {
  77.     ptrDato Pila = NULL;
  78.     int i = 0,a = 0, Elementos = 0,Longitud = 0;
  79.     char dato;
  80.  
  81.     Longitud = No tienes permisos para ver links. Registrate o Entra con tu cuenta(cadena);
  82.  
  83.     char * buffer = (char*) No tienes permisos para ver links. Registrate o Entra con tu cuenta(Longitud);
  84.     No tienes permisos para ver links. Registrate o Entra con tu cuenta(buffer,0,Longitud);
  85.  
  86.     while(cadena[i] != '\0')
  87.     {
  88.         if (cadena[i] == '(')
  89.         {
  90.             push(&Pila,cadena[i]);
  91.             Elementos += 1;
  92.         }else if (cadena[i] == ')'){
  93.             while(1)
  94.             {
  95.                 dato = pop(&Pila);
  96.                 Elementos -= 1;
  97.  
  98.                 if(dato == '(')
  99.                 {
  100.                     break;
  101.                 }else{
  102.                     buffer[a] = dato;
  103.                     a += 1;
  104.                 }
  105.             }
  106.         }else if(cadena[i] == '*' || cadena[i]  == '/' || cadena[i] == '+' || cadena[i] == '-'){
  107.             RepetirProceso:
  108.             if (Elementos == 0)
  109.             {
  110.                 push (&Pila,cadena[i]);
  111.                 Elementos += 1;
  112.             }else if(Prioridad(Pila->caracter,cadena[i]) == 1)
  113.             {
  114.                 push(&Pila,cadena[i]);
  115.                 Elementos += 1;
  116.             }else if (Pila->caracter != '('){
  117.                 dato = pop(&Pila);
  118.                 Elementos -= 1;
  119.  
  120.                 buffer[a] = dato;
  121.                 a += 1;
  122.  
  123.                 goto RepetirProceso;
  124.             }
  125.         }else{
  126.             buffer[a] = cadena[i];
  127.             a += 1;
  128.         }
  129.         i++;
  130.     }
  131.  
  132.     while(Pila != 0)
  133.     {
  134.         buffer[a] = pop(&Pila);
  135.         a += 1;
  136.     }
  137.     return buffer;
  138. }
  139.  
  140. int Prioridad(char Op1,char Op2)
  141. {
  142.         int Estado = 1;
  143.  
  144.         if (Op1 == '*' && Op2 == '-' || Op1 == '*' && Op2 == '+' || Op1 == '/' && Op2 == '-' || Op1 == '/' && Op2 == '+')
  145.         {
  146.             Estado = 0;
  147.         }
  148.  
  149.         return Estado;
  150. }
  151.  
  152. char pop(ptrDato * Pila)
  153. {
  154.     ptrDato ViejoDato;
  155.     char _caracter;
  156.  
  157.     ViejoDato = *Pila;
  158.     _caracter = (*Pila)->caracter;
  159.  
  160.     *Pila = (*Pila)->Siguiente;
  161.  
  162.     No tienes permisos para ver links. Registrate o Entra con tu cuenta(ViejoDato);
  163.  
  164.     return _caracter;
  165. }
  166. void push(ptrDato * Pila,char caracter)
  167. {
  168.     ptrDato NuevoDato;
  169.  
  170.     NuevoDato = (ptrDato)No tienes permisos para ver links. Registrate o Entra con tu cuenta(sizeof(_Dato));
  171.     No tienes permisos para ver links. Registrate o Entra con tu cuenta(NuevoDato,0,sizeof(_Dato));
  172.  
  173.     if (NuevoDato != NULL)
  174.     {
  175.         NuevoDato->caracter = caracter;
  176.         NuevoDato->Siguiente = *Pila;
  177.  
  178.         *Pila = NuevoDato;
  179.     }
  180. }
  181.  
« Última modificación: Noviembre 13, 2013, 11:18:20 am por mDrinky »

Conectado ANTRAX

  • *
  • Administrator
  • Mensajes: 5380
  • Actividad:
    75%
  • Reputación 31
  • ANTRAX
    • Ver Perfil
    • Underc0de
    • Email
  • Skype: underc0de.org
  • Twitter: @Underc0de
« Respuesta #1 en: Noviembre 13, 2013, 09:12:15 am »
Muy bueno mDrinky!
Cuando dices que no resuelve numeros con dos caracteres, tambien te refieres a numeros decimales?

Saludos!


Desconectado 79137913

  • *
  • Co Admin
  • Mensajes: 631
  • Actividad:
    5%
  • Reputación 11
  • 4 Esquinas
    • Ver Perfil
    • Doors.Party
    • Email
  • Skype: fg_mdq@hotmail.com
« Respuesta #2 en: Noviembre 13, 2013, 09:33:45 am »
HOLA!!!

Quiere decir que su metodo toma a cada caracter como numero completo no como digitos de un numero mas grande...

Osea:
923 seria para su procedimiento 9 ; 2 ; 3

y 9,23 seria para su procedimiento 9 ; , ; 2 ; 3

GRACIAS POR LEER!!!
"Algunos creen que soy un bot, puede que tengan razon"
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

*Shadow Scout Team*                                                   No tienes permisos para ver links. Registrate o Entra con tu cuenta

Desconectado Stiuvert

  • *
  • Colaborador
  • *
  • Mensajes: 2667
  • Actividad:
    0%
  • Reputación 14
    • Ver Perfil
  • Skype: stiuvert@gmail.com
  • Twitter: @Stiuvert
« Respuesta #3 en: Noviembre 13, 2013, 09:36:44 am »
No tienes permisos para ver links. Registrate o Entra con tu cuenta
Cuando dices que no resuelve numeros con dos caracteres, tambien te refieres a numeros decimales?

Seguramente no los aceptará Antrax.

Porque esta usando números enteros (Int), para que aceptará números decimales tendría que usar "float".


Saludos

Conectado ANTRAX

  • *
  • Administrator
  • Mensajes: 5380
  • Actividad:
    75%
  • Reputación 31
  • ANTRAX
    • Ver Perfil
    • Underc0de
    • Email
  • Skype: underc0de.org
  • Twitter: @Underc0de
« Respuesta #4 en: Noviembre 13, 2013, 09:42:40 am »
Tienen razon! ahi lo lei!
Ahora si vale la aclaracion de mDrinky

Citar
No resolvera numeros de dos caracteres, aunque modificando un poco el codigo se peude conseguir


Desconectado 79137913

  • *
  • Co Admin
  • Mensajes: 631
  • Actividad:
    5%
  • Reputación 11
  • 4 Esquinas
    • Ver Perfil
    • Doors.Party
    • Email
  • Skype: fg_mdq@hotmail.com
« Respuesta #5 en: Noviembre 13, 2013, 10:31:23 am »
HOLA!!!

No tienes permisos para ver links. Registrate o Entra con tu cuenta
No tienes permisos para ver links. Registrate o Entra con tu cuenta
Cuando dices que no resuelve numeros con dos caracteres, tambien te refieres a numeros decimales?

Seguramente no los aceptará Antrax.

Porque esta usando números enteros (Int), para que aceptará números decimales tendría que usar "float".


Saludos

Lamento decir que esa apreciacion es erronea, se puede operar con enteros y para calcular decimales... simplemente se realiza una simulacion de coma flotante donde se multiplica el numero por una potencia de diez grande, luego se realizan las opreaciones y por ultimo se vuelve a dividir...

Ejemplo:
9,7*8,2=> ((9,7*10)*(8.2*10))=>7954 /100 = 79.54
Ahora ustedes me diran, usaste punto en la ultima division...
NO, se hace asi la cuenta:
Int(7954/100)=79 (aca sabemos que la parte entera es 79, eso lo guardamos
79*100 = 7900 ...  7954-7900 = 54 (la parte decimal)

de esta manera ponemos 79 , 54 y no utilizamos decimales ;)

GRACIAS POR LEER!!!
"Algunos creen que soy un bot, puede que tengan razon"
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

*Shadow Scout Team*                                                   No tienes permisos para ver links. Registrate o Entra con tu cuenta

Desconectado Juan

  • *
  • Underc0der
  • Mensajes: 159
  • Actividad:
    0%
  • Reputación 0
  • Ex-Drinky
    • Ver Perfil
« Respuesta #6 en: Noviembre 13, 2013, 11:17:36 am »
Es lo que dice 7913,  He actualizado el código corrigiendo y minimizando algunas cosillas :P

 

¿Te gustó el post? COMPARTILO!