1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 |
/* 6x04-Notacion_postfija_con_pilas 07/02/2012 Escribe un programa que lea de teclado una expresión en notación postfija y la evalúe, mostrando su resultado por pantalla. Para ello implementa y utiliza una pila. */ #include <stdio.h> #include <string.h> #include <stdlib.h> struct NODO { int valor; struct NODO *puntero; }; // FUNCIÓN QUE PASA UNA CADENA CON NUMEROS A ENTERO: int pasaCadenaAEntero( char cadena[20] ) { /* Precondición: Se ha de recibir una cadena de caracteres terminada en fin de linea que contenga solo un numero entero de máximo 20 dígitos. Poscondición: Se pasa esa cadena al tipo entero y se devuelve el valor. */ int longCadena=strlen(cadena), numero=0, i; for( i=0; i<longCadena; i++ ) { numero *= 10; numero += cadena[i]-48; }; return numero; }; // FUNCIÓN QUE INTRODUCE UN NUMERO EN UNA PILA: void insertaDatoEnLaPila( struct NODO **pila, int num ) { /* Precondición: Se ha de recibir un doble puntero de tipo struct NODO para una pila, y un parámetro de tipo entero. Poscondición: Se introduce el numero recibido en la pila. */ struct NODO *temp = (struct NODO *) malloc(sizeof(struct NODO)); temp->valor = num; temp->puntero = *pila; *pila = temp; }; // FUNCIÓN QUE EXTRAE EL PRIMER ELEMENTO DE LA PILA Y BORRA EL NODO VACIO: int extraeDatoDeLaPila( struct NODO **pila ) { /* Precondición: Se ha de recibir un doble puntero de tipo struct NODO para una pila. Poscondición: Se devuelve el primer parámetro de tipo entero almacenado en la pila. */ struct NODO *siguiente; int resp; // Se copia el valor a la variable que va a ser retornada por la función: resp = (*pila)->valor; // Se elimina el primer Nodo (el vaciado): siguiente = (*pila)->puntero; free(*pila); *pila = siguiente; return resp; }; // FUNCIÓN QUE LIBERA LA MEMORIA USADA POR UNA LISTA: void listaLiberaRam( struct NODO **lista ) { /* Precondición: Se ha de recibir un puntero de tipo struct NODO al primer nodo de la lista. Poscondición: Se borran todos los nodos de esa lista hasta llegar a NULL. */ struct NODO *actual, *siguiente; actual = *lista; while(actual != NULL) { siguiente = actual->puntero; free(actual); actual = siguiente; }; *lista = NULL; }; main() { struct NODO *pila; char cad[20]; int val1, val2; printf( "Introduce una expresión en notación postfija para hallar el resultado.\n" ); printf( "Introduzca un valor o operador y pulse intro para introducir el siguiente, escriba = para calcular el resultado\n" ); printf( " Ejemplo:\n\n 5\n 9\n +\n 2\n *\n 6\n 5\n *\n +\n\n" ); printf( "Indique la expresion:\n\n" ); do{ // Se lee un valor o operador: scanf( "%s", cad ); // Dependiendo de lo leido se hace una operacion u otra: switch( cad[0] ) { case '+': // En el caso de la: '+', '-', '*' y '/', se sacan dos valores de la pila, se opera con ellos según el operador elegido y se guarda el resultado en la pila. val1 = extraeDatoDeLaPila( &pila ); val2 = extraeDatoDeLaPila( &pila ); insertaDatoEnLaPila( &pila, val1 + val2 ); break; case '-': val1 = extraeDatoDeLaPila( &pila ); val2 = extraeDatoDeLaPila( &pila ); insertaDatoEnLaPila( &pila, val1 - val2 ); break; case '*': val1 = extraeDatoDeLaPila( &pila ); val2 = extraeDatoDeLaPila( &pila ); insertaDatoEnLaPila( &pila, val1 * val2 ); break; case '/': val1 = extraeDatoDeLaPila( &pila ); val2 = extraeDatoDeLaPila( &pila ); insertaDatoEnLaPila( &pila, val1 / val2 ); break; case '=': // Se imprime por pantalla el ultimo y único elemento de la pila. printf( "\nEl resultado es: %i\n\n", extraeDatoDeLaPila( &pila ) /*pila->valor*/ ); break; default: // Se introduce un nuevo dato en la pila: insertaDatoEnLaPila( &pila, pasaCadenaAEntero(cad) ); break; }; } while( cad[0] != '=' ); }; |
hola amigo una consulta este algoritmo es recursivo ??
No, no lo es, pero tampoco es difícil añadírselo.
Saludos.
Hola, estoy haciendo una calculador en NPI i me he ajudado un poco a partir de este codigo. El problema es que no se como cambiar la parte donde se pasa de una cadena a un entero para que en vez de salirme un entero me salga un real y asi hacer las operaciones con los reales. si me pudieses dar alguna indicacion me seria de gran ajuda. Gracias!