Beruflich Dokumente
Kultur Dokumente
Tipos
abstractos
de
datos
lineales
Pilas
ndice
5-2
Introduccin
Implementacin dinmica
Implementacin esttica
Problemas y ejercicios
Bibliografa
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Obje8vos
5-3
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Tema 5
Tipos abstractos
de datos lineales
Tema 6
II. Pilas
El tipo abstracto de dato Pila representa una estructuras de datos
donde los elementos se disponen de forma secuencial y las
operaciones de insercin y extraccin se aplican por el principio
segn la poltica de acceso ltimo en entrar, primero en salir
III. Colas
El tipo abstracto de dato Cola representa una estructuras de datos
donde los elementos se disponen de forma secuencial y las
operaciones de insercin y extraccin se aplican por el final y por el
principio respectivamente de acuerdo a la poltica de primero en
entrar, primero en salir
5-4
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
4
Cima
Las operaciones de
insercin y
extraccin se
realizan por un
extremo llamado
cima
5-5
3
2
1
Pila
Una pila puede imaginarse como una
estructura de datos que dispone los
mismos en secuencia uno encima de
otros de manera que siempre el ltimo
elemento en apilarse es el nico que
puede ser directamente accedido
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
2
3
1
2
3
push (1)
pop ()
1
2
3
1
2
3
5-6
Insertar
La operacin push inserta un elemento encima
de la cima de manera que el elemento
insertado pasa a ser la nueva cima
Extraer
2
3
Es vaca
1
2
3
falso
cima
Todas las operaciones de una pila se atacan
por la cima. Este mtodo devuelve el elemento
en la cima sin extraerlo
cierto
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
1
2
3
2
3
cierto
falso
1
2
3
1
2
3
getLength ()
contains
(3)
cierto
contains
(7)
falso
1
2
3
5-7
Longitud
La longitud de una pila devuelve el nmero de
elementos que esta contiene. Si la pila esta
vaca devuelve 0. Si esta llena devuelve la
capacidad de la pila
Bsqueda
La operacin contains busca un elemento en la
pila e indica si est contenido dentro de la
misma
Recorrido
1
2
3
/**
*
Devuelve
cierto
si
la
pila
esta
llena.
*
@return
cierto
si
la
pila
esta
llena.
*/
public
boolean
isFull();
/**
*
Devuelve
el
numero
de
elementos
de
la
pila.
*
@return
el
numero
de
elementos
de
la
pila.
*/
public
int
getLength
();
/**
*
Devuelve
cierto
si
la
pila
contiene
el
elemento.
*
@param
element
El
elemento
buscado.
*
@return
cierto
si
la
pila
contiene
el
elemento.
*/
public
boolean
contains
(T
element);
/**
*
Devuelve
un
iterador
para
la
pila.
*
@return
un
iterador
para
la
pila.
*/
public
IteratorIF<T>
getIterator
();
}
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Cima y siguiente
5-8
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
5-9
@Override
public
T
getTop
()
{
return
element;
}
@Override
public
StackIF<T>
push
(T
element)
{
if
(element
!=
null)
{
StackDynamic<T>
stack
=
new
StackDynamic<T>
();
stack.element
=
this.element;
stack.next
=
this.next;
this.element
=
element;
this.next
=
stack;
}
return
this;
}
@Override
public
StackIF<T>
pop
()
{
if
(!isEmpty
())
{
element
=
next.element;
next
=
next.next;
}
return
this;
}
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
@Override
public
IteratorIF<T>
getIterator
()
{
StackIF<T>
handler
=
new
StackDynamic<T>
(this);
return
new
StackIterator<T>
(handler);
}
@Override
public
int
hashCode
()
{
return
31
*
((element
==
null)
?
0
:
element.hashCode
())
+
((next
==
null)
?
0
:
next.hashCode
());
}
@SuppressWarnings("unchecked")
@Override
public
boolean
equals
(Object
o)
{
...
}
@Override
public
String
toString
()
{
...
}
}
5 - 10
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Extraer
Extraer mueve la cima de la pila
una posicin hacia atrs con lo
que la posicin anterior pasa a
ser la nueva cima. Cima == 0
indica una pila vaca luego esa
posicin se desaprovecha
5 - 11
Basura
Capacidad = 10
1
2
3
3
7
0
0
0
0
cima
Este ndice apunta siempre
al elemento que se
encuentra en la cima de la
pila. El ndice comienza en
0 y llega hasta capacidad1
para valores de la pila
Insertar
Las inserciones mueven la cima
una posicin hacia adelante e
insertan el elemento. Si cima
llega a valer capacidad - 1 el
array est lleno y no se puede
insertar
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
5 - 12
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
@Override
public
boolean
contains
(T
element)
{
IteratorIF<T>
stackIt
=
this.getIterator
();
boolean
found
=
false;
while
(!found
&&
stackIt.hasNext
())
{
T
anElement
=
stackIt.getNext
();
found
=
anElement.equals
(element);
}
return
found;
}
@Override
public
IteratorIF<T>
getIterator
()
{
StackIF<T>
handler
=
new
StackStatic<T>
(this,
capacity);
return
new
StackIterator<T>
(handler);
}
@Override
public
int
hashCode
()
{...}
@SuppressWarnings("unchecked")
@Override
public
boolean
equals
(Object
o)
{...}
@Override
public
String
toString
()
{...}
}
5 - 13
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Primero
es
cima
El primer elemento
de una lista se
corresponde con la
cima de la pila
2 3 4 5 6 7 8 9
ListIF
Pila
La pila se implementa a partir de cualquier implementacin del
TAD Lista con interfaz ListIF. La operacin de insertar se
implementa con la insercin en la lista y la de extraccin con la
operacin de obtener resto de la lista
5 - 14
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
@Override
public
StackIF<T>
pop
()
{
list
=
list.getTail
();
return
this;
}
@Override
public
boolean
isEmpty
()
{
return
list.isEmpty
();
}
@Override
public
boolean
isFull()
{
return
list.isFull
();
}
@Override
public
int
getLength
()
{
return
list.getLength
();
}
@Override
public
boolean
contains
(T
element)
{
return
list.contains
(element);
}
*
5 - 15
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
@Override
public
String
toString
()
{
StringBuffer
buff
=
new
StringBuffer
();
buff.append
("StackList
-
[");
IteratorIF<T>
stackIt
=
getIterator
();
while
(stackIt.hasNext
())
{
T
element
=
stackIt.getNext
();
buff.append
(element);
if
(stackIt.hasNext
())
buff.append
(",
");
}
buff.append
("]");
return
buff.toString
();
}
}
5 - 16
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
II. Bsqueda
La bsqueda de un elemento sobre los elementos de una pila se realiza de
forma secuencial dada la definicin del tipo lo que imprime un coste lineal al
algoritmo. Si esta operacin no fuese una operacin interna del tipo dicha
bsqueda sera destructiva o requerira utilizar un iterador (con copia) o
reconstruir la estructura tras el algoritmo. La bsqueda como operacin
interna permite implementar el algoritmo no destructivamente sobre la
estructura interna.
5 - 17
Independencia de la
implementacin
Algoritmos
sobre pilas
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
4
3
2
1
5 - 18
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
5 - 19
Hay
siguiente
Para saber si el iterador contiene ms elementos y por
tanto puede volver a invocarse la operacin de avance o
no, hay que preguntar si el manejador ha alcanzado el final
de la pila
Reset
Una vez que un iterador ha llegado a su fin slo se puede
construir otro iterador, o resetear este a su valor inicial. En
este caso sin embargo, la operacin de reset requiere una
copia con lo que el coste es idntico al de construir un
nuevo iterador.
handler
reset
()
handler
4
3
2
1
restart
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
5 - 20
Bsqueda
recursiva
En
la
bsqueda
recursiva
se
comprueba
si
la
cabeza
se
corresponde
con
el
elemento
buscado.
Si
es
as
el
algoritmo
termina
devolviendo
cierto
y
si
no,
se
recurre
sobre
el
resto
de
la
pila
para
buscar
el
elemento
/**
*
Devuelve
cierto
si
la
lista
contiene
el
elemento.
*
@param
element
El
elemento
buscado.
*
@return
cierto
si
la
lista
contiene
el
elemento.
*/
@Override
public
boolean
contains
(T
element)
{
if
(isEmpty
())
return
false;
return
this.element.equals
(element)
||
next.contains
(element);
}
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Ejercicios
Dado
el
carcter
destruc6vo
de
las
operaciones
sobre
pilas
para
avanzar
en
una
pila
es
necesario
extraer
su
cima
con
pop
la
realizacin
de
muchos
de
sus
algoritmos
requiere
de
un
proceso
de
proteccin
consistente
en
hacer
una
copia
de
la
misma.
Ignorando
el
problema
de
destruccin
resuelva
los
siguientes
problemas
I. Longitud de una pila
Disee
una
funcin
que
calcule
el
nmero
de
elementos
que
con6ene
una
pila
V. Insertar en la base
X. Pila prefijo
5 - 21
III. Subpila
Disee
una
funcin
que
dada
una
lista
determine
si
sta
est
contenida
en
una
pila
como
subpila
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Problemas
Las
pilas
son
un
6po
abstracto
de
datos
que
se
u6liza
recurrentemente
en
los
problemas
de
cierta
complejidad
de
programacin.
A
con6nuacin
planteamos
algunos
ejemplos
de
problemas
que
se
resuelven
con
el
uso
de
pilas.
Las torres de Hanoi
5 - 22
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Problemas
Las
pilas
son
un
6po
abstracto
de
datos
que
se
u6liza
recurrentemente
en
los
problemas
de
cierta
complejidad
de
programacin.
A
con6nuacin
planteamos
algunos
ejemplos
de
problemas
que
se
resuelven
con
el
uso
de
pilas.
La carta blanca
5 - 23
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Problemas
Las
pilas
son
un
6po
abstracto
de
datos
que
se
u6liza
recurrentemente
en
los
problemas
de
cierta
complejidad
de
programacin.
A
con6nuacin
planteamos
algunos
ejemplos
de
problemas
que
se
resuelven
con
el
uso
de
pilas.
Calculadora en notacin postfija
5 - 24
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
BibliograTa
Bibliografa bsica
Estructuras de datos en java. Weiss, Mark
Allen. Pearson Addison Wesley. ISBN
9788478290352
5 - 25
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
BibliograTa
Bibliografa complementaria
Estructura de datos y algoritmos en java. A.
Drozdek. Thomsom. ISBN: 9706866116. 2007
5 - 26
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es