/***********************CONVIERTE POSICION POSFIJA A INFIJA SI PRODECE*/
int Pos_Inf(char *pos)    //transforma el contenido de la cadena a posicion infija, y devuelve 1; si no es valida la poscicion posfija entonces no hace nada y retorna 0
{
    Limpia_Espacios(pos,1);                                                     //elimina espacio no deseados, maximo 1 espacio intermedio para separar variables
    int i=0, espacio =0, caracter=0, operandos=0, indice=0;
    PILA *tope=NULL;
    char caden[strlen(pos)+1], temporal[2]={'!', '\0'};                         //en caden almacenara las variables
    char caden3[2]={'!','\0'};                                                  //caden2 es de [100] porq se va concatenar y debe tener el espacio sufiente para soportar una expresion grande, la caden3 se concatena despues
    char caden2[100];        
    while(pos[i] != '\0')                                                       //Recorre la cadena pos caracter por caracter hasta el nulo
    {
         if(pos[i]==' ')                                                        //si es un espacio.El espacio tiene como funcion separara variables, si hay variable sin meter en pila, entonces q la meta ya
         {
              if(caracter>0)
              {
                   caden[indice]='\0';                                               //agrega el caracter nulo a la cadena para despues meterla en la pila
                   Push(&tope,caden);   
                   operandos++;                                                 //lleva el conteo de los elementos en la pila
                   caracter=0;                                                  //lleva el conteo de la longitud de las variables en espera
                   indice=0;                                                    //lleva el conteo del indice valido para caden
              }
         }
         else if(pos[i] == '^'|| pos[i] == '*'|| pos[i] == '/'|| pos[i] == '+'|| pos[i] == '-')     //si es un operador,Tiene como funcion 2 cosas, si hay variables pendientes de meter en pila q las meta y sino y/o despues efectue la operacion
         {
              if(caracter>0)                                                    //actue como un espacio, es decir q lo meta en pila
              {
                   caden[indice]='\0';
                   Push(&tope,caden);
                   operandos++;
                   caracter=0;
                   indice=0;
              }
              if(operandos>1)                                                   //si hay almenos 2 varibles o expresiones en la pila q efectue el algoritmo
              {
                   caden2[1]='\0';
                   if((tope->parentesis==0 && tope->sig->parentesis==0) ||(tope->llaves>1 || tope->sig->llaves>1)) //si no hay parentesis en ningun operado, o almenos un operando ya tiene llaves; significa que cierre la expresion con parentesis, e indique en el operando q va quedar en la pila q contiene parentesis
                   {
                        caden2[0]='(';
                        caden3[0]=')';
                        tope->sig->parentesis=1;                                //este va a quedar en la pila. El apuntado por tope se va a fusionar con este.
                   }
                   else if((tope->parentesis==1 || tope->sig->parentesis==1) && (tope->corchetes==0 && tope->sig->corchetes==0))//si ya existe un parentesis en almenos 1 de los operandos , y,ninguno tiene corchetes ; entonces procede a poner corchetes
                   {
                        caden2[0]='[';
                        caden3[0]=']';
                        tope->sig->corchetes=1;                                 //este va a quedar en la pila.El tope se concatenara con este
                   }
                   else                                                         //Significa q van las llaves
                   {
                       caden2[0]='{';
                       caden3[0]='}';
                       tope->sig->llaves++;                                     //indiq q hay llaves
                       tope->sig->parentesis=0;                                 //resetea de todo nuevamente
                       tope->sig->llaves=0;
                   }
                   
                   temporal[0]=pos[i];                                          //el arreglo temporal contiene el operador, NOTA el temporal[1]='\0' siempre            
                   strcat(tope->sig->cadena,temporal);                          //concatena cadena q esta en la pila(una antes del tope) con el operador
                   strcat(tope->sig->cadena,tope->cadena);                      //vuelve a contatenar ahora con la cadena que esta en el tope
                   Pop(&tope);                                                  //saque el ultimo y por ende resta uno al contador de la pila         
                   operandos--; 
                   //esto q sigue anade los parentesis llaves o corchetes
                   strcat(caden2,tope->cadena);
                   strcat(caden2,caden3);
                   strcpy(tope->cadena,caden2);       
              }
              else                                                              //si solo hay 1 operador o menos entonces error ya que no tiene con q operandos efectuar la operacion
                   return 0;
         }
         else
         {
              caden[indice]=pos[i];                                             //En otro caso es una letra y que la meta en caden
              indice++;                                                         //El indice cambia
              caracter++;                                                       //Hay una variables de por lo menos 1 caracter en espera
         }
         i++;                                                                   //Cambia i y continua con el siglo
    }//fin del while
    if(operandos>1 || tope==NULL)                                               //Ya fuera del ciclo pregunta, si hay mas de 1 operando o expresion, si la hay significa que faltaron operadores y no es valido eso, o, pregunta si la pila esta vacia; este caso significa que nunca inserto nada
         return 0;
         
    else                                                                        //si entra aca es porq todo va bien solo falta eliminar los caracteres separadores<<< ( [ { >>>del principio y del final y listo
         {
         caden3[0]='(';                                                         //reutilizamos caden3 y le ponemos ( porq hay conflicto en el if con el parentesis
         if(tope->cadena[0]== caden3[0] || tope->cadena[0]=='[' || tope->cadena[0]== '{') //evalua si el primer caracter es un separador y si lo es debemos eliminarlo
         {
              tope->cadena[0]=' ';                                              //lo sobreescribe con espacio
              for(i=0;tope->cadena[i]!='\0';i++);                               //lleva hasta el ultimo (tambien hay q eliminarlo)
              tope->cadena[i-1]=' ';
              Limpia_Espacios(tope->cadena,0);                                  //limpia los espacio primero y ultimo.
         }
         
         strcpy(pos,tope->cadena);                                              //la cadena esta lista, es la apuntada por tope; la copie en la cadena pasada por referencia                         
         Elimina(&tope);                                                        //liberamos el contenido de la pila                                         
         return 1;                                                              
         }
}
Esempio n. 2
0
int main()
{ Tx v[20], vv[10], *r,
	x = {3, -9.35, "test"}, y = {-1,1,"y"}, z = {0,0,"a"};
	TMultime m1 = {sizeof(Tx),comp3,NULL,v,v+10,v+20}, *a = &m1,
		 m2, *b = &m2, m3, *c;
	int i, nr, nvv, nrr1;
	int rez;

	randomize();
	printf("--- Demo multimi generice ---\n");
	/* initializeaza 10 elemente din v cu valori aleatoare */
	for(i = 0; i < 10; i++) inix(v+i);
	for(nvv = 4,i = 0; i < nvv; i++) inix(vv+i);
	/* initializeaza b */
	InitS(b, vv,10,sizeof(Tx),comp3,NULL);
	Adauga(v+5,b);    /* o valoare preluata din a */
	Adauga(&y, b), Adauga(&z, b);

	/* S = secventa de prelucrari, folosind operatii generice: */
	/*   - afisare multime, - test apartenenta, - test localizare */
	printf("-- Multimea a --\n");
	afiMx(a);
	rez = Apartine(&x, a);
	printf("elementul (%i,%4.2lf,%s) %sapartine multimii\n\n",
			x.v1, x.v2, x.v3, rez? "" : "nu ");
	y = v[2];
	r = (Tx*)Loc(&y, a);
	if(!r)
		printf("elementul (%i,%4.2lf,%s) nu apartine multimii\n\n",
				y.v1, y.v2, y.v3);
	else
		printf("elementul (%i,%4.2lf,%s) are adresa %p si indice %i \n\n",
				y.v1, y.v2, y.v3, r, r-v);
	getch();

	/* - adaugare 2 noi elemente: unul care nu exista si altul care exista
	   - afisare multime */
	printf("\n-- Teste adaugari --\n\n");
	rez = Adauga(&x, a);
	if(rez) printf("(%i,%4.2lf,%s) %s\n",
			x.v1, x.v2, x.v3, rez? "adaugat" : "exista deja");
	rez = Adauga(&y, a);
	if(rez) printf("(%i,%4.2lf,%s)  %s\n\n",
			y.v1, y.v2, y.v3, rez? "adaugat" : "exista deja");
	afiMx(a);

	/* - eliminare 2 elemente: unul care exista si altul care nu exista
	   - afisare multime
	   */
	printf("\n-- Teste eliminari --\n\n");
	rez = Elimina(&y, a);
	printf("(%i,%4.2lf,%s) %s\n",
			y.v1, y.v2, y.v3, rez? "eliminat" : "nu exista");
	rez = Elimina(&z, a);
	printf("(%i,%4.2lf,%s) %s\n",
			z.v1, z.v2, z.v3, rez? "eliminat" : "nu exista");
	afiMx(a);

	getch();

	printf("\n-- Test reuniune --\n\n");
	c = InitD(50,sizeof(Tx),comp3,comp3);
	if(!c)
	{ printf("Initializate dinamica esuata\n");
		getch(); return 1;
	}
	printf("\na:\n"); afiMx(a);
	printf("\nb:\n"); afiMx(b);
	nrr1 = Reuniune(a,b,c);
	printf("\n-- rezultat Reuniune(a,b)--\n"); afiMx(c);

	getch();

	/* Sortare multime, urmata de afisare */


	/* Repetarea S folosind functii specifice multimii sortate */


	return 0;
}
Esempio n. 3
0
CTga::~CTga()
{
	Elimina();
}