1 / 32

La pila

La pila. Estructuras de datos. LA PILA. Cima de la pila. La pila (stack) es una estructura ordenada de elementos en la que se pueden insertar o remover elementos por un extremo llamado la cima de la pila (stack top). El apuntador de pila (stack pointer) señala al elemento de la cima.

aglaia
Download Presentation

La pila

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. La pila Estructuras de datos

  2. LA PILA Cima de la pila La pila (stack) es una estructura ordenada de elementos en la que se pueden insertar o remover elementos por un extremo llamado la cima de la pila (stack top). El apuntador de pila (stack pointer) señala al elemento de la cima. La pila puede carecer por completo de elementos, en tal caso se le llama pila vacía. En una pila vacía el apuntador de pila señala a NULL. Apuntador de pila Una pila

  3. OPERACIONES BÁSICAS Las operaciones básicas de la pila son: Apilar (push(s, i)) - inserta un nuevo elemento a la pila. Desapilar (pop(s)) - remueve el elemento de la cima de la pila. E D D D i=D C C C C B B B B A A A A Pila antes de Push(s, E) Pila después de Push(s, E) Pila antes de i  Pop(s) Pila después de i  Pop(s)

  4. EVOLUCIÓN DE UNA PILA

  5. OTRAS OPERACIONES La función EMPTY(S) es verdadera si la pila está vacía. La operación STACKTOP(S), que es equivalente a un POP seguido de un PUSH. I = POP(S); PUSH(S,I); determina el valor del elemento de la cima sin removerlo.

  6. ALGORITMO DE CHEQUEO DE PARÉNTESIS Algoritmo para checar paréntesis. La expresión se almacena en la cadena S. 1. VALIDO ¬ VERDADERO 2. I ¬ 1 3. CONTADOR ¬ 0 4. MIENTRAS VALIDO AND I <= LONGITUD(S) HACER a. SI S[I] = '(' ENTONCES 1. CONTADOR ¬ CONTADOR + 1 b. SINO 1. SI S[I] = ')' ENTONCES a. CONTADOR ¬ CONTADOR - 1 b. SI CONTADOR < 0 ENTONCES 1. VALIDO ¬ FALSO c. I ¬ I + 1 5. SI CONTADOR <> 0 ENTONCES a. VALIDO ¬ FALSO

  7. Implementación en C int checa(char *s){ int i=0,contador=0,valido=1; while(valido&&i<strlen(s)){ if(s[i]=='(') contador++; else if(s[i]==')'){ contador--; if(contador<0) valido=0; } i++; } if(contador!=0) valido=0; return valido; }

  8. ALGORITMO DE CHEQUEO DE PARÉNTESIS 2 Algoritmo para checar expresiones con paréntesis bien construidas. Se utiliza una pila P. La cadena se almacena en una variable S. 1. VALIDO ¬ VERDADERO 2. I ¬ 1 3. MIENTRAS VALIDO AND I <= LONGITUD(S) a. SI (S[I] = '(') OR (S[I] = '[') OR (S[I] = '{') ENTONCES 1. PUSH(P,S[I]) b. SINO 1. SI (S[I] = ')') OR SI (S[I] = ']') OR SI (S[I] = '}') ENTONCES a. SI EMPTY(P) ENTONCES 1. VALIDO ¬ FALSO b. SINO 1. C ¬ POP(P) 2. SI NOT((C='(' AND S[I] = ')')OR(C='[' AND S[I] =']') OR (C='{' AND S[I]= '}')) ENTONCES a. VALIDO ¬ FALSO c. I ¬ I + 1 4. SI NOT EMPTY(P) ENTONCES a. VALIDO ¬ FALSO

  9. Implementación int checa(char *s){ int i=0,valido=1; pila p; char c; p.tope = -1; printf("cad = %s\n",s); while(valido&&i<strlen(s)){ if(s[i]=='('||s[i]=='[‘ ||s[i]=='{') push(&p,s[i]); else if(s[i]==')'||s[i]==']‘ ||s[i]=='}'){ if(empty(p)) valido=0; else{ c = pop(&p); if(!(c=='('&&s[i]==')‘ ||c=='['&&s[i]==']‘ ||c=='{'&&s[i]=='}')) valido = 0; } } i++; } if(!empty(p)) valido=0; return valido; }

  10. REPRESENTACIÓN Una pila puede representarse con un registro, uno de los campos es un entero usado como apuntador de pila y el otro campo es un arreglo lineal de elementos de la pila. S.TOPE = apuntador de pila. S.ITEM[S.TOPE] = elemento de la cima de la pila

  11. OPERACIONES EMPTY Y POP NOTA: Se supone una pila de caracteres Función EMPTY(S:PILA) regresa BOOLEANO 1. SI S.TOPE = 0 ENTONCES a. REGRESA VERDADERO 2. SINO a. REGRESA FALSO Función POP(S:PILA) regresa CARÁCTER 1. X ¬ S.ITEM[S.TOPE] 2. S.TOPE ¬ S.TOPE - 1 3. REGRESA X

  12. OTRA VERSIÓN DE POP Función POP(S:PILA) regresa CARÁCTER 1. SI EMPTY(S) ENTONCES a. ERROR (‘bajo flujo, pila vacía’) 2. SINO a. X ¬ S.ITEM[S.TOPE] b. S.TOPE ¬ S.TOPE - 1 c. REGRESA X

  13. OPERACIÓN POPANDTEST SUBRUTINA POPANDTEST(S: PILA; BAJOFLUJO: BOOLEANO; X: CARÁCTER) 1. SI EMPTY(S) ENTONCES a. BAJOFLUJO ¬ VERDADERO 2. SINO a. BAJOFLUJO ¬ FALSO b. X ¬ S.ITEM[S.TOPE] c. S.TOPE ¬ S.TOPE - 1 d. REGRESA X

  14. OPERACIÓN PUSH SUBRUTINA PUSH(S:PILA, X:CARACTER) 1. S.TOPE ¬ S.TOPE + 1 2. S.ITEM[S.TOPE] ¬ X SUBRUTINA PUSH(S:PILA, X:CARACTER) 1. SI S.TOPE = STACKSIZE ENTONCES a. ERROR (’sobreflujo en la pila’) 2. SINO a. S.TOPE ¬ S.TOPE + 1 b. S.ITEM[S.TOPE] ¬ X

  15. OPERACIÓN STACKTOP FUNCION STACKTOP(S:PILA) regresa CARACTER 1. SI EMPTY(S) ENTONCES a. ERROR (‘pila vacia’) 2. SINO a. REGRESA S.ITEM[S.TOP]

  16. Operaciones de pila en C #define TAMANOPILA 100 struct pila{ int tope; char item[TAMANOPILA]; }; int empty(pila s){ if(s.tope==-1) return 1; else return 0; }

  17. Operaciones de pila en C (cont.) char pop(pila *s){ char x = s->item[s->tope]; s->tope--; return x; } void push(pila *s,char x){ s->tope++; s->item[s->tope] = x; }

  18. REPRESENTACIÓN DE EXPRESIONES Entrefijo - el operador se escribe entre los dos operandos. Es la normalmente utilizada en álgebra. Prefijo - el operador se escribe antes de los operandos. Se utiliza en algunos lenguajes de programación como LISP. Posfijo - el operador se escribe después de los operandos. Es utilizada en algunas calculadoras y computadoras.

  19. EJEMPLOS DE EXPRESIONES

  20. EJEMPLO DE CONVERSIÓN Conversión de entrefijo a prefijo ((a+b)*c-(d-e))^(f+g) ((+ab)*c-(-de))^(+fg) ((*(+ab)c)-(-de))^(+fg) (-(*(+ab)c)(-de))^(+fg) ^(-(*(+ab)c)(-de))(+fg) ^-*+abc-de+fg

  21. EJEMPLO DE CONVERSIÓN 2 Conversión de entrefijo a posfijo ((a+b)*c-(d-e))^(f+g) ((ab+)*c-(de-))^(fg+) (((ab+)c*)-(de-))^(fg+) (((ab+)c*)(de-)-)^(fg+) ((((ab+)c*)(de-)-)(fg+)^) ab+c*de--fg+^

  22. ALGORITMO DE EVALUACIÓN DE POSFIJO Algoritmo para evaluar una cadena en posfijo. Se suponen números de un solo dígito. La pila S guarda valores numéricos. 1. MIENTRAS no se lea toda la cadena a. Leer el siguiente símbolo y almacenarlo en simb b. SI simb es un operando entonces 1. PUSH(S,SIMB) c. SINO 1. OP2 ¬ POP(S) 2. OP1 ¬ POP(S) 3. VALOR ¬ resultado de aplicar simb a op2 y op1 4. PUSH(S,VALOR) 2. RESULTADO ¬ POP(S)

  23. Ejemplo de evaluación 2 3 5 + 4 * + => 2 + (3 + 5)*4 = 2 + 32 = 34 Symb op2 op1 valor pila 2 2 3 2, 3 5 2, 3, 5 + 5 3 8 2, 8 4 5 3 8 2, 8, 4 * 4 8 32 2, 32 + 32 2 34 34

  24. FUNCIÓN ES_DÍGITO FUNCION ES_DIGITO ( C : CARÁCTER ) REGRESA BOOLEANO 1. SI C >= '0' AND C <= '9' ENTONCES a. REGRESAR VERDADERO 2. SINO a. REGRESAR FALSO

  25. FUNCIÓN OPER FUNCION OPER(SIMB : CARACER, OP1, OP2 : REAL ) REGRESA REAL 1. SI SIMB = '+' ENTONCES a. REGRESA OP1 + OP2 2. SI SIMB = '-' ENTONCES a. REGRESA OP1 - OP2 3. SI SIMB = '*' ENTONCES a. REGRESA OP1 * OP2 4. SI SIMB = '/' ENTONCES a. REGRESA OP1 / OP2 5. SI SIMB = '^' ENTONCES a. REGRESA OP1 ^ OP2

  26. ALGORITMO DE EVALUACIÓN 1. I ¬ 1 2. MIENTRAS I <= LONGITUD(CAD) HACER a. SIMB ¬ CAD[I] b. SI ES_DIGITO(SIMB) ENTONCES 1. PUSH(S, SIMB - 48) c. SINO 1. OP2 ¬ POP(S) 2. OP1 ¬ POP(S) 3. VALOR ¬ OPER(SIMB, OP2, OP1) 4. PUSH(S,VALOR) d. I ¬ I + 1 3. RESULTADO ¬ POP(S)

  27. Evaluación en C float evalua(char *s){ int pos; float op1,op2,valor; pila p; char c; p.tope = -1; for(pos=0; pos<strlen(s); pos++){ c = s[pos]; if(esdigito(c)) push(&p,c-'0'); else{ op1 = pop(&p); op2 = pop(&p); valor = oper(c,op1,op2); push(&p,valor); } } return pop(&p); }

  28. esdigito y oper en C int esdigito(char c){ return c>='0' && c<='9'; } float oper(charc,float op1, float op2){ switch(c){ case '+':return op1+op2; case '-':return op2-op1; case '*':return op1*op2; case '/':return op2/op1; } }

  29. CONVERSIÓN DE ENTREFIJO A POSFIJO En la expresión a + b * c no puede procesarse el signo + hasta haber procesado el signo * dado que tiene precedencia respecto a +. La función PRCD acepta dos caracteres y es verdadera si el primer símbolo tiene precedencia respecto al segundo: PRCD('*',' +') es VERDADERO PRCD('+','+') es VERDADERO PRCD('+', '*') es FALSO

  30. ALGORITMO DE CONVERSIÓN Algoritmo para convertir una cadena en entrefijo en posfijo. S es una pila de operadores. 1. I ¬ 1 2. MIENTRAS I <= LONGITUD(CAD)HACER a. SIMB ¬ CAD[I] b. SI ES_OPERANDO(SIMB) ENTONCES 1.agregar a la cadena de posfijo c. SINO 1.MIENTRAS(NOT EMPTY(S)AND PRCD(STACKTOP(S), SIMB ))HACER a. SIMBTOPE ¬ POP(S) b. agregar a la cadena de posfijo 2. PUSH(S,SIMB) d. I ¬ I + 1 3. MIENTRAS NOT EMPTY(S) a. SIMBTOPE ¬ POP(S) b. agregar a la cadena de posfijo

  31. USO DE PARÉNTESIS Para incluir expresiones con paréntesis basta con definir adecuadamente la función PRCD. La siguiente tabla resume estos valores: PRCD('(', op) = FALSO para cualquier operador op PRCD(op, '(') = FALSO para cualquier operador op que no sea ')’ PRCD(op, ')')=VERDADERO para cualquier operador op que no sea ')’ Además hay que asegurar que el símbolo ')' no sea insertado en al pila y que el paréntesis que abra sea descartado. Para esto cambiamos la sentencia PUSH por SI (EMPTY(S) OR SIMB <> ')') ENTONCES PUSH(S,SIMB) SINO SIMBTOPE = POP(S) [extrae el paréntesis que abre]

  32. ALGORITO DE CONVERSIÓN FINAL 1. I ¬ 1 2. MIENTRAS I <= LONGITUD(CAD) a. SIMB ¬ CAD[I] b. SI ES_OPERANDO(SIMB) ENTONCES 1. agregar a la cadena de posfijo c. SINO 1. POPANDTEST(S,SIMBTOPE,BAJOFLUJO) 2. MIENTRAS (NOT BAJOFLUJO AND PRCD(STACKTOP(S),SIMB)) a. agregar a la cadena de posfijo b. POPANDTEST(S,SIMBTOPE,BAJOFLUJO) 3. SI NOT BAJOFLUJO ENTONCES a. PUSH(S,SIMBTOPE) 4. SI (EMPTY(S) OR SIMB <> ')') ENTONCES a. PUSH(S,SIMB) 5. SINO a. SIMBTOPE = POP(S) [extrae el paréntesis que abre] d. I ¬ I + 1 3. MIENTRAS NOT EMPTY(S) a. SIMBTOPE ¬ POP(S) b. agregar a la cadena de posfijo

More Related