Exemplo n.º 1
0
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];
}
Exemplo n.º 2
0
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++;
    }
}