Documente Academic
Documente Profesional
Documente Cultură
Pilas
Las pilas son estructuras muy sencillas y poderosas, también conocidas como LIFO (last in,
first out) por la forma en que se trabaja con ellas. Ejemplo de ellas son las pilas de charolas
en una panaderı́a, donde sólo se puede tomar la charola que está arriba de pila y si se quiere
depositar una charola se debe hacer arriba de las demás.
4.1. Motivación
Se tienen tres palos o postes, en el primero de ellos se tienen n discos de diferente tamaño
cada uno. El disco de mayor diámetro se encuentra en el fondo del palo y el de diámetro
menor hasta arriba, con la restricción que ningún disco de tamaño mayor puede colocarse
sobre uno menor. Los otros dos palos están vacı́os. El problema consiste en pasar los discos
del primer palo al segundo, usando el tercer palo como auxiliar. Este es un ejemplo de uso
de una pila.
Si el número de discos es tres, la solución al problema consta de los siguientes pasos:
¿Como son los movimientos de los discos? Siempre se toma el disco de más arriba y
se coloca hasta arriba del palo al que se desea pasar. Esto da pie a una estructura de
datos denominada pila. Una pila es una estructura con la restricción que las inserciones y
supresiones son siempre por el mismo lado, denominado tope.
1
CAPÍTULO 4. PILAS 2
Se puede observar que para 3 discos se requieren 7 movimientos. En general para n discos
se requieren 2n − 1 movimientos. Existe una leyenda que dice que en la ciudad de Hanoi
hay unos monjes dedicados a resolver el problema con 64 discos. (De ahı́ que este problema
se conoce como el problema de las torres de Hanoi.) Si mover cada disco les toma un dı́a,
entonces resolver el problema tomará 264 − 1 dı́as. La parte fea de la historia es que el dı́a
que resuelvan el problema se terminará el mundo :)
Aunque el problema, no usa pilas en su solución programada se incluye aquı́ porque es
un ejemplo ilustrativo del concepto de pila y se presenta como un ejemplo de recursión más
elaborada.
La solución al problema consiste en pasar primero el disco1 del palo1 al palo2. Entonces
el problema se reduce a pasar los n − 1 discos restantes del palo1 al palo3 y finalmente
regresar esos n − 1 discos del palo3 al palo2. A continuación la implementación recursiva
de la solución.
public Hanoi () {
System.out.println("Torres de Hanoi");
tamanio = 3;
solucion(tamanio, ’a’,’b’,’c’);
}
c Amparo López Gaona, 2006
CAPÍTULO 4. PILAS 3
4.2. Implementación
Una pila es una lista con la restricción que las inserciones y supresiones son siempre por
el mismo lado, denominado tope.
La interfaz para el manejo de este tipo de datos es la siguiente:
interfaz Apilable {
public void push(Object);
public void pop();
public Object top();
}
pop. Elimina el elemento que se insertó al último. Si la pila está vacı́a causa un error.
top. Regresa el valor del elemento que se insertó al último. Si la pila está vacı́a causa
un error (NoSuchElementException). Con este método no se altera el estado de la
pila.
/**
* Construye la pila.
*/
public Pila() { tope = null; }
c Amparo López Gaona, 2006
CAPÍTULO 4. PILAS 4
/**
* Verifica que la pila esté llena. En esta implementación
* @return false siempre.
*/
public boolean estáLlena() { return false; }
/**
* Verifica que la pila esté vacı́a.
* @return true si lo está y falso en otro caso.
*/
public boolean estáVacı́a (){ return tope == null; }
/**
* Vacı́a una pila.
*/
public void vaciaPila() { tope = null; }
/**
* Devuelve el elemento del tope de la pila (sin alterar ésta)
* o bien null si se encuentra vacı́a.
*/
public Object top() {
return (estáVacı́a()) ? null : tope.elemento;
}
/**
* Extrae el elemento del tope de la pila.
* Devuelve null si la pila está vacı́a.
*/
public Object pop() {
if (estáVacı́a())
return null;
/**
c Amparo López Gaona, 2006
CAPÍTULO 4. PILAS 5
c Amparo López Gaona, 2006
CAPÍTULO 4. PILAS 6
El problema consiste en determinar si una expresión aritmética tiene bien anidados sus
paréntesis. Considerando tres tipos de éstos. Es decir, que no ocurra que se tengan más
paréntesis de un tipo que de otro y que cierren adecuadamente. Por ejemplo,
(a+[b*c]/[d-h])*25 es correcta
{a+{b+c+{d+e}+e}} es correcta
{a+{b+c+{d+e}+e} es incorrecta
((a+b} es incorrecta
El algoritmo es el siguiente:
1. Crear una pila vacı́a.
if (pila.estáVacı́a())
c Amparo López Gaona, 2006
CAPÍTULO 4. PILAS 7
System.out.println("Parentesis balanceados");
else reportaError();
}
Tener la expresión de esta forma, facilita su evaluación como se verá en la siguiente sección.
Para simplificar este algoritmo sólo se utilizan los operadores de suma, multiplicación y
paréntesis, con las reglas de precedencia de siempre y se asume que la expresión es correcta.
Ejemplos:
a + b * c + (d * e + f) * g ----> abc*+de*f+g*+
El algoritmo de conversión empieza teniendo una pila vacı́a y una expresión, en notación
infija, correcta.
c Amparo López Gaona, 2006
CAPÍTULO 4. PILAS 8
1. Leer un elemento.
2. Mientras haya elementos, hacer los pasos a al e:
c Amparo López Gaona, 2006
CAPÍTULO 4. PILAS 9
c Amparo López Gaona, 2006