1 La Pila o Stack Programación
2 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. Una pila Cima de la pila Apuntador de pila LA PILA
3 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. A B C D Pila antes de Push(s, E) A B C D Pila después de Push(s, E) E A B C D Pila antes de i Pop(s) A B C Pila después de i Pop(s) i=D OPERACIONES BÁSICAS
4 EVOLUCIÓN DE UNA PILA
5 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. OTRAS OPERACIONES
6 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
7 Actividad Escriba el algoritmo de chequeo de paréntesis en Java.
8 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
9 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 REPRESENTACIÓN
10 Función EMPTY(S:PILA) regresa BOOLEANO 1. SI S.TOPE = 0 ENTONCES 2. REGRESA VERDADERO 3. SINO 4. 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 NOTA: Se supone una pila de caracteres OPERACIONES EMPTY Y POP
11 Función POP(S:PILA) regresa CARÁCTER 1. SI EMPTY(S) ENTONCES 2. ERROR (‘bajo flujo, pila vacía’) 3. SINO 4. X = S.ITEM[S.TOPE] 5. S.TOPE = S.TOPE - 1 6. REGRESA X OTRA VERSIÓN DE POP
12 SUBRUTINA POPANDTEST(S: PILA; BAJOFLUJO: BOOLEANO; X: CARÁCTER) 1. SI EMPTY(S) ENTONCES 2. BAJOFLUJO = VERDADERO 3. SINO 4. BAJOFLUJO = FALSO 5. X = S.ITEM[S.TOPE] 6. S.TOPE = S.TOPE - 1 7. REGRESA X OPERACIÓN POPANDTEST
13 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 2. ERROR (’sobreflujo en la pila’) 3. SINO 4. S.TOPE = S.TOPE + 1 5. S.ITEM[S.TOPE] ¬ X OPERACIÓN PUSH
14 FUNCION STACKTOP(S:PILA) regresa CARACTER 1. SI EMPTY(S) ENTONCES 2. ERROR (‘pila vacia’) 3. SINO 4. REGRESA S.ITEM[S.TOP] OPERACIÓN STACKTOP
15 Implementación de pilas en Java public class PilaChar{ private char pila[]; private int tope; public PilaChar(int capacidad){ pila = new char[capacidad]; tope = -1; } public boolean isEmpty(){ return tope == -1; } public void push(char i){ if(tope+1 < pila.length) pila[++tope] = i; } public char pop(){ if(isEmpty()) return 0; return pila[tope--]; } public String toString(){ return new String(pila,0,tope+1); } } Primero se incrementa, luego se hace la asignación Primero se obtiene el valor de pila y luego se decrementa. Convierte a cadena un arreglo de caracteres.
16 Actividad Escriba en Java el algoritmo de chequeo de paréntesis de tres tipos utilizando pilas. Escriba un applet que lea una expresión con un TextField e informe si la expresión está correcta.
17 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. REPRESENTACIÓN DE EXPRESIONES
18 EJEMPLOS DE EXPRESIONES entrefijoprefijoposfijo a+b+abab+ (a+b)*c*+abcab+c* (a-b)*(c-d)*-ab-cdab-cd-* ((a+b)*c-(d-e))^(f+g)^-*+abc-de+fgab+c*de--fg+^
19 EJEMPLO DE CONVERSIÓN ((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 Conversión de entrefijo a prefijo
20 ((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+ ^ Conversión de entrefijo a posfijo EJEMPLO DE CONVERSIÓN 2
21 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 2. Leer el siguiente símbolo y almacenarlo en simb 3. SI simb es un operando entonces 4. PUSH(S,SIMB) 5. SINO 6. OP2 = POP(S) 7. OP1 = POP(S) 8. VALOR = resultado de aplicar simb a op2 y op1 9. PUSH(S,VALOR) 10. RESULTADO = POP(S)
22 FUNCIÓN ES_DÍGITO FUNCION ES_DIGITO ( C : CARÁCTER ) REGRESA BOOLEANO 1. SI C >= '0' AND C
23 FUNCIÓN OPER FUNCION OPER(SIMB : CARACER, OP1, OP2 : REAL ) REGRESA REAL 1. SI SIMB = '+' ENTONCES 2. REGRESA OP1 + OP2 3. SI SIMB = '-' ENTONCES 4. REGRESA OP1 - OP2 5. SI SIMB = '*' ENTONCES 6. REGRESA OP1 * OP2 7. SI SIMB = '/' ENTONCES 8. REGRESA OP1 / OP2 9. SI SIMB = '^' ENTONCES 10. REGRESA OP1 ^ OP2
24 ALGORITMO DE EVALUACIÓN 1. i = 1 2. MIENTRAS i
25 Actividad Escriba el algoritmo de evaluación de posfijo en Java.
26 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
27 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
28 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) = FALSOpara cualquier operador op PRCD(op, '(') = FALSOpara cualquier operador op que no sea ')’ PRCD(op, ')')=VERDADEROpara 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 ]
29 ALGORITO DE CONVERSIÓN FINAL 1. i = 1 2. MIENTRAS i
30 24. MIENTRAS NOT EMPTY(S) 25. SIMBTOPE = POP(S) 26. agregar a la cadena de posfijo