double evaluar(char posfija[100], int largo){ double a, b, c, temp; double stac[100]; int i, top=0; for(i=0;i<largo;i++){ if(posfija[i]==',') continue; else if(esOperando(posfija[i])){ temp=(double)posfija[i] -'0'; char a=posfija[++i]; while(a!=',' && esOperando(a)){ temp*=10; temp+=(double)a -'0'; a=posfija[++i]; } i--; //printf("OPERANDO: %d\n", ); stac[top++]=temp; } else { b=stac[--top]; a=stac[--top]; switch(posfija[i]){ case '+': c=a+b; break; case '-': c=a-b; break; case '*': c=a*b; break; case '/': c=a/b; break; } stac[top++]=c; } } return stac[top-1]; }
int main(){ int n; Stack s; s=empty(); char c; char posfija[100]; int largo=0; int flag=0; // Se pasa a posfija while(1){ if(!flag) scanf("%c",&c); else flag=0; if(c=='\n' || c=='\0') break; if(c=='('||c=='{'||c=='[') s=push(c,s); else if(c==')' || c=='}' || c==']'){ char a=top(s); while(a!='(' && a!='{' && a!='['){ posfija[largo++]=a; s=pop(s); a=top(s); } s=pop(s); } else if(esOperando(c)==1){ posfija[largo++]=c; scanf("%c",&c); while(esOperando(c)){ if(c=='\n' || c=='\0'){ flag=1; break; } posfija[largo++]=c; scanf("%c",&c); } posfija[largo++]=','; flag=1; continue; } else if(esOperador(c)){ while(!isEmpty(s) && (prec(top(s))>= prec(c))){ posfija[largo++]=top(s); s=pop(s); } s=push(c,s); } } while(!isEmpty(s)){ posfija[largo++]=top(s); s=pop(s); } // Se termina la conversion printf("%.2lf\n",evaluar(posfija, largo)); return 0; }
void verificarExpresion(char** cad){ String cadena = *cad; int length = strlen(cadena); /** Auxiliares para continuar con el ciclo*/ int i = 0; StackEntry op1, op2, res; int posError; bool evalacion = true; /** Pila para el evaluador */ ptrNodoPila pila = NULL; while(cadena[i] != '\0' && evalacion == true){ /** Validamos si se trata de un operando */ if(esOperando(cadena[i])){ int aux = cadena[i] -'0'; push(&pila,aux); } else /**Validamos si es un operador */ if (esOperador(cadena[i])){ /** Valida si existen al menos dos operandos */ if(!stackEmpty(&pila)){ op2 = pop(&pila); if (!stackEmpty(&pila)){ op1 = pop(&pila); res = calcular(op1, cadena[i], op2); push(&pila,res); }else{ printf("\nSe esperaba un operando antes del operador %c en lo posicion %d\n",cadena[i],i+1); break; } }else{ printf("\nSe esperaban dos operandos antes del operador %c en lo posicion %d\n",cadena[i],i+1); break; } }else{ printf("Caracter invalido en la posicion %d\n",i+1); break; } /** Valida que haya quedado solo un numero en la pila */ i++; } if(!stackEmpty(&pila)){ res = pop (&pila); if(stackEmpty(&pila)) printf("\n<<< Expresion posfija valida!>>>\n<<< Resultado final:\t%d>>>\n",res); else printf("\n>>> Se esperaban mas operadores\n"); } }
void convertirExpresion(char **cad){ String cadena = *cad; String cPosfija = (String*) malloc(sizeof(String));; //Cadena donde se insertara la expresion convertida cPosfija = (String *) malloc(sizeof(String)); /** Pilas para los delimitadores*/ ptrNodoPila pilaExpresion = NULL; int i = 0; while(cadena[i] != '\0'){ if (esOperando(cadena[i])) push(&pilaExpresion,cadena[i]); else if(esOperador(cadena[i])){ if (stackEmpty(pila)) { /* code */ } } i++; } }