Tipos
abstractos
de
datos
lineales
Listas
ndice
4-2
Introduccin
Implementacin dinmica
Implementacin esttica
Ejercicios
Bibliografa
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Obje8vos
4-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
4-4
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Primero
Toda lista no vaca
distingue un primer
elemento que
puede ser operado
directamente
2 3 4 5 6 7 8 9
Lista
La definicin de la lista como un par (primero, resto) induce un
acceso recursivo a la misma donde los elementos se acceden por
la cabeza (posicin del primero) y para llegar al elemento i-esimo
hay que recorrer los i-1 elementos anteriores
4-5
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
1
1
2 3
Insertar
2 3
4-6
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
3 1 2
3
1
2
1
2
3
4-7
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Primero y resto
4-8
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
@Override
public
ListIF<T>
getTail
()
{
if
(isEmpty
())
return
this;
return
tail;
}
@Override
public
ListIF<T>
insert
(T
element)
{
if
(element
!=
null)
{
ListDynamic<T>
next
=
new
ListDynamic<T>();
next.first
=
first;
next.tail
=
tail;
first
=
element;
tail
=
next;
}
return
this;
}
@Override
public
boolean
isEmpty
()
{
return
first
==
null
&&
tail
==
null;
}
@Override
public
boolean
isFull
()
{
return
false;
* Los comentarios
}
de las cabeceras se
han omitido por cuestiones de espacio
4-9
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
@Override
public
boolean
equals
(Object
o)
{
if
(o
==
this)
return
true;
if
(o
==
null)
return
false;
if
(!(o
instanceof
ListDynamic))
return
false;
else
{
ListDynamic<T>
l
=
(ListDynamic<T>)
o;
return
l.first.equals
(first)
&&
l.tail.equals
(tail);
}
}
@Override
public
String
toString
()
{
StringBuffer
buff
=
new
StringBuffer
();
buff.append
("ListDynamic
-
[");
IteratorIF<T>
listIt
=
getIterator
();
while
(listIt.hasNext
())
{
T
element
=
listIt.getNext
();
buff.append
(element);
if
(listIt.hasNext
())
buff.append
(",
");
}
buff.append
("]");
return
buff.toString
();
}
4 - 10
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
0
0
0
0
3
7
1
2
3
4
Insertar
4 - 11
Lista
Capacidad = 10
Primero
Este ndice apunta siempre
al elemento que se
encuentra en cabeza de la
lista. El ndice comienza en
0 y llega hasta capacidad1
para valores de la lista
Resto
Acceder al resto mueve la cabeza una posicin
hacia delante con lo que sta pasa a ser el
primero del resto. Si Primero llega a valer la
capacidad indica que la lista es vaca. Para que
la operacin no sea modificadora esta
implementacin requiere la copia preliminar de
la estructura.
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
4 - 12
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
4 - 13
@Override
public
int
hashCode
()
{
return
31
*
31
*
((elements
==
null)
?
0
:
elements.hashCode
())
+
31
*
capacity
+
first;
}
@SuppressWarnings("unchecked")
@Override
public
boolean
equals
(Object
o)
{
if
(o
==
this)
return
true;
if
(o
==
null)
return
false;
if
(o.getClass
()
!=
this.getClass
())
return
false;
else
{
ListStatic<T>
l
=
(ListStatic<T>)
o;
return
l.elements.equals
(elements)
&&
l.capacity
==
capacity
&&
l.first
==
first;
}
}
@Override
public
String
toString
()
{
StringBuffer
buff
=
new
StringBuffer
();
buff.append
("ListStatic
-
[");
IteratorIF<T>
listIt
=
getIterator
();
while
(listIt.hasNext
())
{
T
element
=
listIt.getNext
();
buff.append
(element);
if
(listIt.hasNext
())
buff.append
(",
");
}
* Los comentarios de las cabeceras se
buff.append
("]");
return
buff.toString
();
}
}
han omitido por cuestiones de espacio
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Algoritmos
sobre listas
III. Ordenacin
La ordenacin de los elementos de una lista, reorganiza sus elementos de
forma que se dispongan ascendentemente de acuerdo a cierto criterio de
comparacin que se recibe como parmetro. En este captulo estudiaremos
dos conocidos mtodos de ordenacin en listas: ordenacin por insercin
(insert sort) y ordenacin por mezcla (merge sort).La ordenacin
descendente es similar y se deja como ejercicio.
4 - 14
Independencia de la
implementacin
II. Bsqueda
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
4 - 15
getNext
()
Devuelve el siguiente elemento dentro de
la iteracin o null si el iterador alcanz el
final
hasNext
()
Este predicado indica si existen ms
elementos an sin visitar dentro de la
iteracin
reset
()
Este mtodo, incluido por razones de
eficiencia, permite resetear el iterador
para que vuelva al principio sin que sea
necesario construirlo de nuevo
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
1 2 3 4
4 - 16
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
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 lista
Reset
Una vez que un iterador ha llegado a su fin slo se puede
construir otro iterador, lo cual es costoso ya que requiere
una nueva copia del tipo, o volverlo a colocar en su
posicin inicial, Gracias a la copia del manejador que
hicimos en el constructor del iterados, esta operacin tiene
un coste constante
restart
1
2
3
4
reset()
handler
4 - 17
handler
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
4 - 18
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
lista
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
first.equals
(element)
||
tail.contains
(element);
}
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
4 - 19
/**
*
Indica
si
un
elemento
es
igual
que
otro.
*
@param
e1
el
primer
elemento.
*
@param
e2
el
segundo
elemento.
*
@return
true
si
un
elemento
es
igual
que
otro.
*/
public
boolean
isEqual
(T
e1,
T
e2);
/**
*
Indica
si
un
elemento
es
mayor
que
otro.
*
@param
e1
el
primer
elemento.
*
@param
e2
el
segundo
elemento.
*
@return
true
si
un
elemento
es
mayor
que
otro.
*/
public
boolean
isGreater
(T
e1,
T
e2);
}
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Comparator
/**
Se proporciona un comparador cuya
*
Ordena
los
elementos
de
la
lista.
implementacin codifica el criterio de orden entre
*
@param
comparator
El
comparador
de
elementos.
dos elementos de la lista
*
@return
la
lista
ordenada.
*/
@Override
Ordenacin
public
ListIF<T>
sort
(ComparatorIF<T>
comparator)
{
Si la lista es vaca se devuelve sta. Sino, se
if
(isEmpty
())
return
this;
ordena el resto de la lista recursivamente y se
else
return
((ListDynamic<T>)
tail.sort
(comparator))
.sortInsert
(first,
comparator);
inserta en ella el primer elemento en la posicin
}
adecuada segn el criterio de orden
/**
*
Inserta
un
elemento
en
orden
en
una
lista
ordenada.
*
@param
element
El
elemento
a
insertar
*
@param
comparator
El
comparador
de
elementos.
*
@return
la
lista
ordenada.
*/
private
ListIF<T>
sortInsert
(T
element,
ComparatorIF<T>
comparator)
Insercin
en
orden
{
if
(isEmpty
())
return
this.insert
(element);
Si la lista es vaca se devuelve. Si no, si el
else
if
(comparator.isLess
(element,
first))
elemento es menor que el primero, se inserta por
return
this.insert(element);
el principio. Si no, se inserta en el resto el
else
return
((ListDynamic<T>)
tail)
.sortInsert
(element,
comparator).insert
(first);
elemento a insertar
}
5 7 3 2
4 - 20
2 3
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
4 - 21
I.
Fase
de
divisin
Durante la primera fase, el algoritmo divide
recursivamente el problema en subproblemas de
la mitad de tamao. Este proceso requiere
recorrer la lista y tiene un coste de complejidad
lineal
5
7
3
2
5
7
5
3
2
3
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
4 - 22
5 7
2
3
2
3
5
7
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Ejercicios
Dado
el
carcter
recursivo
de
la
denicin
del
6po
abstracto
de
datos
ListIF,
la
mayora
de
algoritmos
sobre
listan
6enen
un
planteamiento
recursivo.
A
con6nuacin
se
presentan
una
coleccin
de
problemas
`picos
sobre
listas
para
que
se
resuelvan
de
esta
manera
I. Longitud de una lista
Disee
una
funcin
recursiva
que
calcule
el
nmero
de
elementos
que
con6ene
una
lista
V. Insertar al final
X. Lista prefijo
4 - 23
III. Sublista
Disee
una
funcin
que
dada
una
lista
determine
si
una
lista
es
sublista
de
otra
dada
de
mayor
tamao
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
Ejercicios
Dado
el
carcter
recursivo
de
la
denicin
del
6po
abstracto
de
datos
ListIF,
la
mayora
de
algoritmos
sobre
listan
6enen
un
planteamiento
recursivo.
A
con6nuacin
se
presentan
una
coleccin
de
problemas
`picos
sobre
listas
para
que
se
resuelvan
de
esta
manera
XIII. Sumar 1
XIV. Pertenecen 2
XIX. Contador
4 - 24
XVIII. Complemento a 1
Disee
una
funcin
recursiva
que
dada
una
lista
de
ceros
y
unos
devuelva
el
complemento
a
1
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
BibliograUa
Bibliografa bsica
Estructuras de datos en java. Weiss, Mark
Allen. Pearson Addison Wesley. ISBN
9788478290352
4 - 25
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es
BibliograUa
Bibliografa complementaria
Estructura de datos y algoritmos en java. A.
Drozdek. Thomsom. ISBN: 9706866116. 2007
4 - 26
Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es