/***********************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; } }
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; }
CTga::~CTga() { Elimina(); }