EJERCICIOS Listas, Pilas y Colas Facultad de Ciencias y Tecnología Departamento de Computación
Enunciado: Intercambiar el tope y el fondo de una pila Ñ F fondo
Análisis de la solución T TOPE F Ñ P fondo A T Pila original Pila Auxiliar
Análisis de la solución T TOPE F Ñ P fondo A Pila original Pila Auxiliar
Análisis de la solución TOPE F Ñ P fondo A T Pila original Pila Auxiliar
Análisis de la solución T TOPE F Ñ P fondo Pila original Pila Auxiliar
Análisis de la solución P A T TOPE F Ñ fondo Pila original Pila Auxiliar
Análisis de la solución Ñ P A T TOPE F Pila original Pila Auxiliar
Análisis de la solución F Ñ P A T TOPE Pila original Pila Auxiliar
Análisis de la solución F Ñ P A T TOPE Pila original Pila Auxiliar
Análisis de la solución F T TOPE Ñ P A Pila original Pila Auxiliar
Análisis de la solución F Ñ P A TOPE T Pila original Pila Auxiliar
Análisis de la solución F TOPE Ñ P T A Pila original Pila Auxiliar
Análisis de la solución F TOPE P Ñ T A Pila original Pila Auxiliar
Análisis de la solución F TOPE A P Ñ T Pila original Pila Auxiliar
Análisis de la solución TOPE F A P Ñ T Pila original Pila Auxiliar
Algoritmo P1,P2: Pila[Elemento]; Top,Fondo:Elemento; Vaciap(p2); TopTope(p1); Si ( EsVacia(p1)) Entonces Desapilar(p1); Mientras( EsVacia(p1)) Hacer FondoTope(p1) Apilar(p2,Fondo); FMientras //Creación de la pila con el tope y fondo invertidos Apilar(p1,Top) Si ( EsVacia(p2)) Entonces Desapilar(p2); Mientras ( EsVacia(p2))Hacer Apilar(p1,Tope(p2)) Desapilar(p2) Apilar(p1,Fondo) Sino Escribir(“Error, pila vacia”) Fsi Escribir(“Error, pila vacia”); fsi
Enunciado: Modificar una lista eliminando los n primeros elementos 10 25 11 32 44 15 Eliminar los primeros 3 elementos
Enunciado: Modificar una lista eliminando los n primeros elementos 25 11 32 44 15
Enunciado: Modificar una lista eliminando los n primeros elementos 11 32 44 15
Enunciado: Modificar una lista eliminando los n primeros elementos 32 44 15
Si (n<=Longitud(L1) Entonces Mientras(i<=n EsVacia(L1) Hacer Algoritmo L1: Lista; i,n : entero; Leer(n); ***Suponemos que la lista está creada y tiene elementos i1 Si (n<=Longitud(L1) Entonces Mientras(i<=n EsVacia(L1) Hacer Resto(L1); ii+1; fMientras
Enunciado: Intercambiar las posiciones p y q de una lista 10 25 11 32 44 15 2 5
Análisis de la solución 10 25 11 32 44 15 2 5 25 44 Se obtienen los elementos de las posiciones p y q a intercambiar
Análisis de la solución 10 11 32 44 15 2 5 44 Eliminando el elemento de la posición p, en este caso 2
Análisis de la solución 10 44 11 32 44 15 2 5 Insertando en la posición p el elemento que estaba en q
Análisis de la solución 10 44 11 32 15 2 5 25 Eliminando de la posición q el elemento allí colocado
Análisis de la solución 10 44 11 32 25 15 2 5 Insertando en la posición q el elemento que estaba en p
Algoritmo L: Lista[Elemento]; p,q: entero; Elem_p,Elem_q: Elemento; Leer(p,q); Si (EsVacia(L) p<=Longitud(L) q<=Longitud(L)) Entonc Elem_pConsultar(L,p); Elem_qConsultar(L,q); Eliminar(L,p) Insertar(L,Elem_q,p) Eliminar(L,q) Insertar(L,Elem_p,q) Sino Escribir(“Error, posiciones invalidas o lista vacia”); Fsi
Elaborar un algoritmo que evalúe una expresión en notación polaca inversa (postfija)
Análisis de la Solución Una expresión en notación Infija (usual) es de la forma: (2*5) + 3 =
Análisis de la Solución Y su evaluación se realiza de izquierda a derecha de acuerdo a la prioridad de los operadores (2*5) + 3 = 10 + 3
Análisis de la Solución Y su evaluación se realiza de izquierda a derecha de acuerdo a la prioridad de los operadores (2*5) + 3 = 13
Análisis de la Solución Infija Postfija (2*5) + 3 2 5 * 3 +
Análisis de la Solución Evaluaremos expresiones en notación postfija usando pilas
Análisis de la Solución Para evaluar una expresión en notación postfija: Se apilan los operandos Cuando aparece un operador, se desapilan dos operandos y el resultado, también se apila
Análisis de la Solución Dada la expresión en postfija: 2 5 * 3 + Se lee el operando 2 y se apila TOPE 2
Análisis de la Solución Evaluando la expresión: 2 5 * 3 + Se lee el operando 5 y se apila 2 TOPE 5
Análisis de la Solución Evaluando la expresión: 2 5 * 3 + Se lee el Siguiente elemento: Es un operador TOPE 2 5
Análisis de la Solución Evaluando la expresión: 2 5 * 3 + Se desapilan dos operandos 2 5 TOPE x2
Análisis de la Solución Evaluando la expresión: 2 5 * 3 + Se desapilan dos operandos 5 2 x2 x1 TOPE
Análisis de la Solución Evaluando la expresión: 2 5 * 3 + Se operan entre si * 5 2 x2 x1 TOPE
Análisis de la Solución Evaluando la expresión: 2 5 * 3 + El resultado se apila * 5 2 x2 x1 10 TOPE
Análisis de la Solución Evaluando la expresión: 2 5 * 3 + El resultado se apila * 5 2 TOPE 10
Análisis de la Solución Evaluando la expresión: 2 5 * 3 + Se lee el siguiente elemento: Es un operando, Por lo tanto se apila TOPE 10
Análisis de la Solución Evaluando la expresión: 2 5 * 3 + Se lee el siguiente elemento: Es un operando, Por lo tanto se apila TOPE 3 10
Análisis de la Solución Evaluando la expresión: 2 5 * 3 + Se lee el siguiente elemento: Es un operador, TOPE 3 10
Análisis de la Solución Evaluando la expresión: 2 5 * 3 + Se desapilan 2 operandos TOPE 10 3 x2
Análisis de la Solución Evaluando la expresión: 2 5 * 3 + Se desapilan 2 operandos 3 10 TOPE x2 x1
Análisis de la Solución Evaluando la expresión: 2 5 * 3 + Se operan los elementos: + 3 10 TOPE x2 x1
Análisis de la Solución Evaluando la expresión: 2 5 * 3 + El resultado se apila + 3 10 x2 x1 TOPE
Análisis de la Solución Evaluando la expresión: 2 5 * 3 + El resultado se apila + 3 10 x2 x1 13 TOPE
Análisis de la Solución Evaluando la expresión: 2 5 * 3 + El resultado se apila + 3 10 x2 x1 TOPE 13
Algoritmo Variables p: Pila[Elemento] s:cadena; x1,x2: Entero; c: carácter; Leer(s); **Cadena que contiene la expresion (en postfija) Vaciap (p);
Algoritmo Mientras (Longitud(s)>0) Hacer cPrimero(s); Si (EsNumero(c)) Entonces Selección(c) caso ‘+’: x2Tope(p); Desapilar(p); x1Tope(p) Apilar(p,x1+x2); . fSeleccion Sino Apilar(p,c); Fsi Resto (s) fMientras Escribir(“La expresion evaluada fue:”,Tope(p));
Algoritmo Casos de la selección (división) Selección(c) caso ’/’: x2Tope(p); Desapilar(p); x1Tope(p); Si(x20) Entonces Apilar(P,x1/x2) Sino Escribir(“Error, division por cero) fsi fSeleccion
Dada una expresión en notación infija, llevarla a notación postfija usando pilas
Procedimiento Dada la expresión en notacion infija (5*4)+3 Al llevarla a notación postfija: 5 4 * 3 + Las expresiones en postfija, no tienen paréntesis.
Procedimiento Dada una cadena, que contiene una expresión en notación infija, la idea es leer caracter a caracter de la cadena de entrada y tomar en cuenta lo siguiente:
Procedimiento Si el caracter es un operando, inmediatamente se añade a la expresión resultado. Si es un operador, se apila inmediatamente, de igual forma se van a apilar los paréntesis izquierdos. Si el elemento leído, es un paréntesis derecho, se sacan elementos de la pila (operadores) hasta que aparece un paréntesis izquierdo (correspondiente), el cual se desapila pero no se añade a la expresión resultado.
Procedimiento Si se ve cualquier otro símbolo en la entrada (‘+’, ’*’ , ’(‘ )´, entonces se sacan elementos de la pila hasta encontrar uno de menor prioridad. (Por lo que no se saca un ‘(‘ de la pila hasta que se vea su correspondiente paréntesis derecho ‘)’ en la cadena de entrada. Para los propósitos de esta operación + tiene la menor prioridad y ‘(’ la más alta, cuando se termina de sacar de la pila, se mete el operando en ella. Por último, si se llega al final de la entrada, se saca todo lo que está en la pila enviando cada elemento a la salida.
Ejemplo Llevar a postfija la siguiente expresión en notación infija: a + b * c + (d * e + f) * g
Ejemplo a + b * c + (d * e + f) * g Primer carácter: es un operando Expresión en infija a + b * c + (d * e + f) * g Primer carácter: es un operando Por lo tanto se añade a la Expresión resultado: a
Ejemplo + + b * c + (d * e + f) * g Siguiente carácter: es un operador Expresión en infija + b * c + (d * e + f) * g Siguiente carácter: es un operador Por lo tanto se apila a TOPE +
Ejemplo + b * c + (d * e + f) * g Siguiente carácter: es un operando, Expresión en infija b * c + (d * e + f) * g Siguiente carácter: es un operando, Se añade a la expresión resultado: a b TOPE +
Ejemplo * + * c + (d * e + f) * g Siguiente carácter: es un operador, Expresión en infija * c + (d * e + f) * g Siguiente carácter: es un operador, Por lo que se apila a b TOPE * +
Ejemplo * + c + (d * e + f) * g Siguiente carácter: operando, Expresión en infija c + (d * e + f) * g Siguiente carácter: operando, Se añade a la expresión resultado: a b c TOPE * +
Ejemplo * + + (d * e + f) * g Siguiente carácter: ’+’operando, Expresión en infija + (d * e + f) * g Siguiente carácter: ’+’operando, Caso Especial a b c Se desapilan operadores hasta conseguir uno de menor o igual prioridad al operador leído y se envían a la expresión resultado TOPE * +
Ejemplo + + (d * e + f) * g Caso Especial a b c * Expresión en infija Se desapilan operadores hasta conseguir uno de menor o igual prioridad al operador leído y se envían a la expresión resultado TOPE +
Ejemplo + (d * e + f) * g Caso Especial a b c * + Expresión en infija Se desapilan operadores hasta conseguir uno de menor o igual prioridad al operador leído y se envían a la expresión resultado TOPE
Ejemplo + + (d * e + f) * g Caso Especial a b c * + Expresión en infija + (d * e + f) * g Caso Especial a b c * + Luego se apila el operador leído TOPE +
Ejemplo + ( (d * e + f) * g Siguiente carácter: un paréntesis: Expresión en infija (d * e + f) * g Siguiente carácter: un paréntesis: Se apila. a b c * + TOPE ( +
Ejemplo + ( d * e + f) * g Siguiente carácter: un operando, Expresión en infija d * e + f) * g Siguiente carácter: un operando, Se añade a la expresión a b c * + d TOPE ( +
Ejemplo + * ( * e + f) * g Siguiente carácter: operador * Expresión en infija * e + f) * g Siguiente carácter: operador * Se apila aun cuando es de menor Prioridad que ‘(‘ a b c * + d TOPE “Los paréntesis no pueden desapilarse hasta que no aparezca un paréntesis derecho” * ( +
Ejemplo + * ( e + f) * g Siguiente carácter: ‘e’ se Expresión en infija e + f) * g Siguiente carácter: ‘e’ se Añade a la expresión a b c * + d e TOPE “Los paréntesis no pueden desapilarse hasta que no aparezca un paréntesis derecho” * ( +
Ejemplo + * ( + f) * g Siguiente carácter: + , sacamos * Expresión en infija + f) * g Siguiente carácter: + , sacamos * De la pila y lo añadimos a la expresion, Apilamos + a b c * + d e * TOPE * ( +
Ejemplo + ( + f) * g Siguiente carácter: + , sacamos * Expresión en infija + f) * g Siguiente carácter: + , sacamos * De la pila y lo añadimos a la expresion, Apilamos + a b c * + d e * TOPE ( +
Ejemplo + + ( + f) * g Siguiente carácter: + , sacamos * Expresión en infija + f) * g Siguiente carácter: + , sacamos * De la pila y lo añadimos a la expresion, Apilamos + a b c * + d e * TOPE + ( +
Ejemplo + + ( f) * g Siguiente carácter: f, se añade a la Expresión en infija f) * g Siguiente carácter: f, se añade a la Expresión resultado a b c * + d e * f TOPE + ( +
Ejemplo + + ( ) * g Siguiente carácter: ‘)’ se desapilan Expresión en infija ) * g Siguiente carácter: ‘)’ se desapilan Todos los operadores hasta que aparezca Un paréntesis izquierdo a b c * + d e * f TOPE + ( +
Ejemplo + ( ) * g Siguiente carácter: ‘)’ se desapilan Expresión en infija ) * g Siguiente carácter: ‘)’ se desapilan Todos los operadores hasta que aparezca Un paréntesis izquierdo a b c * + d e * f + TOPE ( +
Ejemplo + ) * g Siguiente carácter: ‘)’ se desapilan Expresión en infija ) * g Siguiente carácter: ‘)’ se desapilan Todos los operadores hasta que aparezca Un paréntesis izquierdo a b c * + d e * f + TOPE +
Ejemplo * + * g Siguiente carácter: *, se apila a b c * + d e * f + Expresión en infija * g Siguiente carácter: *, se apila a b c * + d e * f + TOPE * +
Ejemplo * + g Siguiente carácter: g, se añade a la Expresión resultado Expresión en infija g Siguiente carácter: g, se añade a la Expresión resultado a b c * + d e * f + g TOPE * +
Ejemplo * + Al quedar la cadena vacía, se desapilan Expresión en infija Al quedar la cadena vacía, se desapilan Los operadores y se añaden a la expresión resultado. a b c * + d e * f + g TOPE * +
Ejemplo + Al quedar la cadena vacía, se desapilan Expresión en infija Al quedar la cadena vacía, se desapilan Los operadores y se añaden a la expresión resultado. a b c * + d e * f + g * TOPE +
Ejemplo Al quedar la cadena vacía, se desapilan Expresión en infija Al quedar la cadena vacía, se desapilan Los operadores y se añaden a la expresión resultado. a b c * + d e * f + g * + TOPE
Ejercicio Propuesto Dada una cadena que contiene una expresión en notación infija, elabore un algoritmo que obtenga una expresión equivalente en notación Postfija. Use pilas.