SlideShare una empresa de Scribd logo
1 de 132
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 1
09/03/2022
Estructuras de datos lineales
(listas)
Unidad 3
Material docente compilado por el profesor Ph.D. Franklin Parrales Bravo
para uso de los cursos de Estructuras de Datos
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 2
09/03/2022
Objetivo general de la Unidad 3
Implementar estructuras de datos lineales usando objetos
para agilizar el manejo de los datos en la memoria principal
de los programas.
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 3
09/03/2022
Contenido
• Listas enlazadas
– Conceptos generales
– Representación gráfica
– Estructura de lista enlazada:
• Clase Lista y constructor nodo de la lista
• Clasificación de listas enlazadas
– Simples, dobles, circulares
– Operaciones básicas: Insertar, buscar, eliminar, recorrido
– Operaciones adicionales: Pilas y colas
• Colecciones genéricas e Iteradores
– Colección List <T> – Listas,
– Stack <T> – Pilas,
– Queue <T> – Colas
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 4
09/03/2022
Contenido
• Listas enlazadas
– Conceptos generales
– Representación gráfica
– Estructura de lista enlazada:
• Clase Lista y constructor nodo de la lista
• Clasificación de listas enlazadas
– Simples, dobles, circulares
– Operaciones básicas: Insertar, buscar, eliminar, recorrido
– Operaciones adicionales: Pilas y colas
• Colecciones genéricas e Iteradores
– Colección List <T> – Listas,
– Stack <T> – Pilas,
– Queue <T> – Colas
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 5
09/03/2022
Listas: definición
• Una lista es
– Una colección de 0 o mas elementos
• Si la lista no tiene elementos, se dice que esta vacía
– En una lista, todos los elementos son de un mismo tipo
• Son estructuras lineales, es decir
– Sus elementos están colocados uno detrás de otro
– Cada elemento de una lista se conoce con el nombre de NODO
• Las listas
– Son mucho más flexibles que los arreglos
– Permiten trabajo “dinámico” con un grupo de elementos
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 6
09/03/2022
Contenido
• Listas enlazadas
– Conceptos generales
– Representación gráfica
– Estructura de lista enlazada:
• Clase Lista y constructor nodo de la lista
• Clasificación de listas enlazadas
– Simples, dobles, circulares
– Operaciones básicas: Insertar, buscar, eliminar, recorrido
– Operaciones adicionales: Pilas y colas
• Colecciones genéricas e Iteradores
– Colección List <T> – Listas,
– Stack <T> – Pilas,
– Queue <T> – Colas
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 7
09/03/2022
Anatomía de una lista enlazada
• Una lista vinculada consta de :
– Una secuencia de nodos
a b c d
▪ Cada nodo contiene un valor
▪ Y un enlace (puntero o referencia) a otro nodo
▪ El último nodo contiene un enlace a null
▪ La lista podría o no tener una cabecera (header)
myList
▪ myList no es un encabezado, es solo una referencia
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 8
09/03/2022
• Para el siguiente ejemplo, cada nodo de la
lista simple es una instancia de la clase que se
muestra aquí.
data
link
10
data
link
15
data
link
7
null
public class IntNode
{
private int data;
private IntNode link;
...
}
Nodos de una lista
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 9
09/03/2022
data
link
7
• La porción de datos de cada nodo en este
ejemplo es un int.
link
null
public class IntNode
{
private int data;
private IntNode link;
...
}
data
link
15
Nodos de una lista
data
10
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 10
09/03/2022
• Cada IntNode también contiene un enlace que
hace referencia a otro IntNode.
data
15
data
7
public class IntNode
{
private int data;
private IntNode link;
...
}
Nodos de una lista
data
10
link
link
null
link
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 11
09/03/2022
Nodos de una lista
10 5 8 2 31
25
25
Contenido Enlace
C S
2 31
25
C S
NODO A
NODO B
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 12
09/03/2022
Declaraciones para listas vinculadas
• Una lista puede realizar un seguimiento del nodo
frontal mediante el uso de una variable como head en
este ejemplo
• Tenga en cuenta que head no es un
IntNode, sólo es una referencia a un
IntNode.
data
link
10
data
link
15
data
link
7
null
head
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 13
09/03/2022
Declaraciones para listas vinculadas
• Representamos la lista vacía almacenando
null en la referencia al head.
head
null
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 14
09/03/2022
Contenido
• Listas enlazadas
– Conceptos generales
– Representación gráfica
– Estructura de lista enlazada:
• Clase Lista y constructor nodo de la lista
• Clasificación de listas enlazadas
– Simples, dobles, circulares
– Operaciones básicas: Insertar, buscar, eliminar, recorrido
– Operaciones adicionales: Pilas y colas
• Colecciones genéricas e Iteradores
– Colección List <T> – Listas,
– Stack <T> – Pilas,
– Queue <T> – Colas
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 15
09/03/2022
Clase Lista
• La clase Lista identifica
una referencia
(puntero) a un objeto
(o null).
• La declaración de la
clase Lista debe
incluir:
– Las variables miembro.
– El/los constructor/es.
– [Opcional] Otros
métodos que vayan a
ser utilizados por
objetos externos.
• Código:
public class Lista
{
NodoLista inicio;
String nombre;
public ListaEnlazada () {
inicio = null;
nombre = null;
}
// Otros métodos
}
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 16
09/03/2022
Clase NodoLista
• La estructura de datos
que representa los
nodos de una lista debe
contemplarse como una
clase (NodoLista.java).
• Se debe declarar:
– Las variables miembro
(clave y sig).
– El/los constructor/es.
– El destructor [innecesario
en Java].
– [Opcional] Otros métodos
que vayan a ser utilizados
por objetos externos
• Código:
public class NodoLista {
int clave;
NodoLista sig;
public NodoLista (int dato) {
clave = dato;
sig = null;
}
// otros métodos
}
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 17
09/03/2022
Contenido
• Listas enlazadas
– Conceptos generales
– Representación gráfica
– Estructura de lista enlazada:
• Clase Lista y constructor nodo de la lista
• Clasificación de listas enlazadas
– Simples, dobles, circulares
– Operaciones básicas: Insertar, buscar, eliminar, recorrido
– Operaciones adicionales: Pilas y colas
• Colecciones genéricas e Iteradores
– Colección List <T> – Listas,
– Stack <T> – Pilas,
– Queue <T> – Colas
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 18
09/03/2022
Tipos
• De acuerdo a su implementación, las listas
se clasifican en
– Simples
– Doblemente Enlazadas
– Circulares
• De acuerdo a su comportamiento, los
conjuntos lineales se clasifican en
– Listas
– Pilas
– Colas
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 19
09/03/2022
Contenido
• Listas enlazadas
– Conceptos generales
– Representación gráfica
– Estructura de lista enlazada:
• Clase Lista y constructor nodo de la lista
• Clasificación de listas enlazadas
– Simples, dobles, circulares
– Operaciones básicas: Insertar, buscar, eliminar, recorrido
– Operaciones adicionales: Pilas y colas
• Colecciones genéricas e Iteradores
– Colección List <T> – Listas,
– Stack <T> – Pilas,
– Queue <T> – Colas
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 20
09/03/2022
Listas enlazadas simples
(SLL: singly linked list)
• Se define como un conjunto de nodos
– Uno detrás de otro
– Del cual siempre se puede conocer al nodo inicial y al final
• De cada nodo de la lista, se conoce
– Un contenido, que es la información que almacena dentro
• Puede ser de cualquier tipo de dato
– Un sucesor único
• Excepto el ultimo nodo
de la lista
10 5 8 2 31
25
25
2 31
25
1
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 21
09/03/2022
Lista simple: nivel lógico
• Comportamiento (a/con una lista se puede)
– Crear y Eliminar
– Conocer si esta vacía
– Añadir elementos y removerlos
– Consultar el primer y al ultimo elemento
– Imprimir sus elementos en pantalla
– Buscar un elemento con cierta información en la lista
• Estado:
<listaSimple> ::= <comienzo> + {<ref_nodo>} + <final>
<comienzo> ::= <enlace>
<final> ::= <enlace>
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 22
09/03/2022
Listas doblemente enlazadas
• En las listas enlazadas solo se avanza en un
sentido
• En las doblemente, se puede avanzar hacia la
derecha o hacia la izq.
2
Cuando la lista
esta vacia,
header y last,
son iguales a
NULL
I DS
DA
last
header
10 5 8 25 2 31
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 23
09/03/2022
Listas doblemente enlazadas
• En estas listas cada nodo tiene
– Un predecesor, excepto el primero
– Un sucesor, excepto el ultimo
• Cada nodo ya no tiene un solo enlace, tiene dos, hacia el
siguiente y hacia el anterior
<lde> ::= <comienzo> + {<nodo>}+<ultimo>
<comienzo> :: = <enlace>
<ultimo> :: = <enlace>
<enlace> ::= (<<referencia_nodo>> | NULL)
<nodo> ::= <predecesor>+<contenido>+<sucesor>
<predecesor> ::= <enlace>
<sucesor> ::= <enlace>
< contenido > ::= <<dato>>{<<dato>>}
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 24
09/03/2022
Listas circulares
• El avance en las listas enlazadas es
– Solo a la derecha(siguiente)
– Limitado hasta el ultimo nodo
• Hay ocasiones en las que se desearia,
– Poder avanzar ilimitadamente
– Del ultimo nodo, pasar al primero
• last->siguiente = header
10 5 8 2 31
25
last->sig last
3
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 25
09/03/2022
Contenido
• Listas enlazadas
– Conceptos generales
– Representación gráfica
– Estructura de lista enlazada:
• Clase Lista y constructor nodo de la lista
• Clasificación de listas enlazadas
– Simples, dobles, circulares
– Operaciones básicas: Insertar, buscar, eliminar, recorrido
– Operaciones adicionales: Pilas y colas
• Colecciones genéricas e Iteradores
– Colección List <T> – Listas,
– Stack <T> – Pilas,
– Queue <T> – Colas
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 26
09/03/2022
TDA Lista
public interface Lista<E> {
public void clear();
public void insert(E item);
public void append(E item);
public E remove();
public void moveToStart();
public void moveToEnd();
public void prev();
public void next();
public int length();
public int currPos();
public void moveToPos(int pos);
public E getValue();
}
Este es un ejemplo de TDA
con el que nuestras
implementaciones de lista
deben coincidir.
Un punto clave a tener en
cuenta aquí: ¡Esto no dice
nada sobre CÓMO se
implementa la lista! Eso viene
después, y usaremos este
TDA para nuestras
implementaciones.
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 27
09/03/2022
NodoLista Class (Listas simples)
Asignación dinámica de nuevos elementos de lista.
class NodoLista<E> {
private E element;
private NodoLista<E> next;
// Constructores
NodoLista(E it, NodoLista<E> nextval){
element = it; next = nextval; }
NodoLista(NodoLista<E> nextval) { next = nextval; }
NodoLista<E> next() { return next; }
NodoLista<E> setNext(NodoLista<E> nextval)
{ return next = nextval; }
E element() { return element; }
E setElement(E it) { return element = it; }
}
1
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 28
09/03/2022
Posición actual en Listas Simples (1)
Enfoque básico: curr (posición actual) apunta al primer nodo en la partición
derecha. Queremos insertar 10 al comienzo de la partición derecha. No hay
acceso (si está disponible) al nodo con valor 23. ¿Cómo podemos hacer la
inserción?
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 29
09/03/2022
Posición actual en Listas Simples (2)
Implementación alternativa: curr apunta al nodo que precede al primer nodo
real en la partición derecha. Ahora podemos hacer la inserción. También tenga
en cuenta el uso del nodo de encabezado. El nodo head elimina casos
especiales en el código.
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 30
09/03/2022
Clase para Lista Enlazada Simple (1)
class LList<E> implements Lista<E> {
private NodoLista<E> head;
private NodoLista<E> tail;
protected NodoLista<E> curr;
int cnt;
//Constructores
LList(int size) { this(); }
LList() {
curr = tail = head = new NodoLista<E>(null);
cnt = 0;
}
head
tail
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 31
09/03/2022
Clase para Lista Enlazada Simple (2)
public void clear() {
head.setNext(null);
curr = tail = head = new NodoLista<E>(null);
cnt = 0;
}
public void moveToStart() { curr = head; }
public void moveToEnd() { curr = tail; }
public int length() { return cnt; }
public void next() {
if (curr != tail) { curr = curr.next(); }
}
public E getValue() {
assert curr.next() != null :
"Nothing to get";
return curr.next().element();
}
head
tail
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 32
09/03/2022
Insertar al inicio de la lista
// Inserto el elemento "it" en la posición de inicio
public void insert(E it) {
head = new NodoLista<E>(it, head));
cnt++; // Aumento el contador
}
10 5 8 2 31
25
tail
head
it
nuevo
head
nuevo->sig = head;
head = nuevo;
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 33
09/03/2022
curr
31
Insertar después de la posición actual
// Inserto el elemento "it" en la posición actual
public void insert(E it) {
curr.setNext(new NodoLista<E>(it, curr.next()));
if (tail == curr)
tail = curr.next();
cnt++; // Aumento el contador
}
10 5 23 2 31
12
head tail
curr
it
tail
it
tail
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 34
09/03/2022
Insertar al final de la lista: Append
public void append(E it) {
tail = tail.setNext(new NodoLista<E>(it, null));
cnt++;
}
31
tail
it
tail
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 35
09/03/2022
Buscar
/** @return True if k is in list L, false otherwise */
public static Boolean find(Lista<Integer> L, int k) {
for (L.moveToStart(); L.currPos()<L.length(); L.next())
if (k == L.getValue())
return true;
return false; // k not found
}
10 5 8 2 31
25
tail
head
Busco 25
p p p p
p
Busco 30
p p p p p
p
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 36
09/03/2022
Eliminar nodo inicial y devolver el elemento borrado
/** Eliminar y devolver el elemento borrado*/
public E removeHead() {
if (head == null){
return null;
}else{
E it = head.element();
head = head.next();
cnt--;
return it;
}
}
10 5 8 2 31
25
head
it = head.
element();
head
head = head->sig;
tail
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 37
09/03/2022
Eliminar nodo no inicial y devolver el elemento borrado
/** Eliminar y devolver el elemento borrado*/
public E remove() {
if (curr.next() == null)
return null;
E it = curr.next().element();
if (tail == curr.next())
tail = curr;
curr.setNext(curr.next().next());
cnt--;
return it;
}
10 5 it 2 31
25
head tail
curr.next()
curr
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 38
09/03/2022
Recorrido para mover curr al nodo previo
/** Move curr one step left; no change if already at front */
public void prev() {
if (curr == head) return; // Si el nodo actual es el head,
retorno dado que no tiene nodo previo
NodoLista<E> temp = head; // Inicio el recorrido desde el
nodo head
// Recorro la lista hacia adelante hasta encontrar el
elemento anterior al nodo actual (curr)
while (p.next() != curr)
p = p.next();
curr = p;
}
10 5 8 2 31
25
tail
head
p
curr
p p p
curr
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 39
09/03/2022
Recorriendo una lista enlazada simple (1)
head =
SLList<String>
next =
data = "Tom"
Node<String>
next =
data = "Dick"
Node<String>
next =
data = "Ann"
null
Node<String>
nodeRef
Hacer algo con
nodeRef
Hacer algo con
nodeRef
Hacer algo con
nodeRef
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 40
09/03/2022
Recorriendo una lista enlazada simple (2)
toString() se puede implementar con un recorrido:
public String toString() {
Node<String> nodeRef = head;
StringBuilder result = new StringBuilder();
while (nodeRef != null) {
result.append(nodeRef.data);
if (nodeRef.next != null) {
result.append(" ==> ");
}
nodeRef = nodeRef.next;
}
return result.toString();
}
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 41
09/03/2022
Get/Set curr Position
/** Return position of the current element */
public int currPos() {
NodoLista<E> temp = head;
int i;
for (i=0; curr != temp; i++)
temp = temp.next();
return i;
}
/** Move down list to "pos" position */
public void moveToPos(int pos) {
assert (pos>=0) && (pos<=cnt) :
"Position out of range";
curr = head;
for(int i=0; i<pos; i++)
curr = curr.next();
}
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 42
09/03/2022
Extensiones a la Lista Enlazada Simple
static NodoLista freelist = null;
static <E> NodoLista<E> get(E it, NodoLista<E> nextval) {
if (freelist == null)
return new NodoLista<E>(it, nextval);
NodoLista<E> temp = freelist;
freelist = freelist.next();
temp.setElement(it);
temp.setNext(nextval);
return temp;
}
void release() { // Return to freelist
element = null;
next = freelist;
freelist = this;
}
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 43
09/03/2022
Usando Freelist
public void insert(E it) {
curr.setNext(NodoLista.get(it, curr.next()));
if (tail == curr) tail = curr.next();
cnt++;
}
public E remove() {
if (curr.next() == null) return null;
E it = curr.next().element();
if (tail == curr.next()) tail = curr;
NodoLista<E> tempptr = curr.next();
curr.setNext(curr.next().next());
tempptr.release();
cnt--;
return it;
}
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 44
09/03/2022
Listas doblemente enlazadas
2
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 45
09/03/2022
Nodos en Listas doblemente enlazadas
class DNodo<E> {
private E element;
private DNodo<E> next;
private DNodo<E> prev;
DNodo(E it, DNodo<E> p, DNodo<E> n)
{ element = it; prev = p; next = n; }
DNodo(DNodo<E> p, DNodo<E> n)
{ prev = p; next = n; }
DNodo<E> next() { return next; }
DNodo<E> setNext(DNodo<E> nextval)
{ return next = nextval; }
DNodo<E> prev() { return prev; }
DNodo<E> setPrev(DNodo<E> prevval)
{ return prev = prevval; }
E element() { return element; }
E setElement(E it) { return element = it; }
}
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 46
09/03/2022
Insertar nodo en Listas doblemente
enlazadas
public void insert(E it) {
curr.setNext(new DNodo<E>(it, curr, curr.next()));
curr.next().next().setPrev(curr.next());
cnt++;
}
head tail
10 5 21 12 17 6
curr
nuevo
it
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 47
09/03/2022
Eliminar nodo en Listas doblemente
enlazadas
public E remove() {
if (curr.next() == tail) return null;
E it = curr.next().element();
curr.next().next().setPrev(curr);
curr.setNext(curr.next().next());
cnt--;
return it;
}
10 5 21 12 17 6
head tail
curr
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 48
09/03/2022
Listas circulares
public class ListaCircular
{
private Nodo lc;
public ListaCircular()
{
lc = null;
}
//...
3
10 5 8 2 31
25
last->sig last
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 49
09/03/2022
Insertar nodo en Listas circulares
public ListaCircular insertar(Elemento entrada)
{
Nodo nuevo;
nuevo = new Nodo(entrada);
if (lc != null) // lista circular no vacía
{
nuevo.enlace = lc.enlace;
lc.enlace = nuevo;
}
lc = nuevo;
return this;
}
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 50
09/03/2022
Eliminar nodo en una lista circular
El algoritmo para eliminar un nodo de una lista circular es:
1. Búsqueda del nodo que contiene el dato.
2. Se enlaza el nodo anterior con el siguiente.
3. En caso de que el nodo a eliminar sea por el que se
accede a la lista, lc, se modifica lc para que tenga la
dirección del nodo anterior.
4. Por último, el sistema libera la memoria ocupada por el
nodo al anular la referencia
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 51
09/03/2022
public void eliminar(Elemento entrada){
Nodo actual;
boolean encontrado = false;
//bucle de búsqueda
actual = lc;
while ((actual.enlace != lc) && (!encontrado)){
encontrado = (actual.enlace.dato == entrada);
if (!encontrado){
actual = actual.enlace;
}
}
encontrado = (actual.enlace.dato == entrada);
// Enlace de nodo anterior con el siguiente
if (encontrado){
Nodo p;
p = actual.enlace; // Nodo a eliminar
if (lc == lc.enlace) // Lista con un solo nodo
lc = null;
else{
if (p == lc){
lc = actual; // Se borra el elemento referenciado por lc,
// el nuevo acceso a la lista es el anterior
}
actual.enlace = p.enlace;
}
p = null;
}
}
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 52
09/03/2022
Recorrer una lista circular
public void recorrer(){
Nodo p;
if (lc != null){
p = lc.enlace; // siguiente nodo al de acceso
do {
System.out.println("t" + p.dato);
p = p.enlace;
}while (p != lc.enlace);
}else
System.out.println("t Lista Circular vacía.");
}
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 53
09/03/2022
Contenido
• Listas enlazadas
– Conceptos generales
– Representación gráfica
– Estructura de lista enlazada:
• Clase Lista y constructor nodo de la lista
• Clasificación de listas enlazadas
– Simples, dobles, circulares
– Operaciones básicas: Insertar, buscar, eliminar, recorrido
– Operaciones adicionales: Pilas y colas
• Colecciones genéricas e Iteradores
– Colección List <T> – Listas,
– Stack <T> – Pilas,
– Queue <T> – Colas
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 54
09/03/2022
Pila (Stack): un TDA simple
 Uno de los conceptos mas utiles en computacion es la pila o stack
 Es un conjunto de elementos, en la que:
 Los elementos se añaden y se remueven por un solo extremo
 Este extremo es llamado “tope” de la pila
La ultima en llegar,
sera la primera en
salir:
LAST IN, FIRST OUT
LIFO
 Ejemplo:
 Cuando un empleado se va de vacaciones, le llega correo a su escritorio.
 Las cartas se van “apilando”.
 Al regresar de vacaciones, la ultima carga en llegar, sera la primera que revisara
 Al terminar de revisarla, la nueva carta del tope de la pila habra cambiado
 Del “pilo” de cartas, la mas nueva que queda, sera la siguiente en ser revisada
1
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 55
09/03/2022
TDA Pila: Definición
• Dada una Pila llamada S
– ¿Qué datos serian importantes conocer sobre la Pila?
– ¿Y que operaciones podriamos efectuar a la misma?
Push(s,elemento1)
Elemento 1
Tope
o Cima
Push(s,elemento2)
Elemento 2
Push(S,elemento3)
Elemento 3
Pop(S)
EstaVacia? No
Si
 Al revisar c/carta, se la “sacaba” de la pila
 elemento = pop(s)
 La operación pop remueve el elemento Tope de
la pila y lo retorna. La pila disminuye su tamaño
 Usemos el ejemplo del correo:
 Al acumularse,
 Cada carta(elemento), era “metida” a la pila:
push(s,elemento)
 La operación push aumenta un elemento a la pila,
y esta aumenta en su tamaño
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 56
09/03/2022
Implementación de pilas mediante
listas enlazadas simples
• Dado que toda la acción ocurre en la parte superior de
una pila, una lista enlazada individualmente (SLL) es una
buena manera de implementarla.
• El encabezado de la lista apunta a la parte superior de la
pila.
• Push es insertar un elemento al principio de la lista
• Pop es eliminar un elemento del principio de la lista.
44 97 23 17
myStack:
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 57
09/03/2022
Pila: operaciones
EliminarPila(Pila)
Efecto: recibe una pila y la libera completamente
EstaVacia(Pila) retorna -> Boolean
Efecto: Devuelve true si esta vacia y false en caso contrario
Push(pila, elemento)
Efecto: Toma la pila y aumenta su tamaño, poniendo
el elemento en la cima de la pila
Pop(Pila) retorna -> elemento
Efecto: Recibe la pila, remueve el elemento tope y lo retorna
Excepcion: Si la pila esta vacia, produce error
TopePila(Pila) retorna -> elemento
Efecto: Devuelve el elemento cima de la pila
Excepcion: Si la pila esta vacia produce error
InicializarPila(Pila)
Efecto: recibe una pila y la inicializa para su trabajo normal
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 58
09/03/2022
TDA pila: definición formal
• En conclusion:
– La pila es un conjunto de elementos
– De los cuales solo conozco y puedo ver el TOPE
• Cada elemento en la pila
– Puede contener informacion de cualquier tipo, es decir, es
generico
<pila> ::= <tope> + {<nodo>}
<tope> ::= <enlace>
<enlace> ::= (<<ReferenciaNodo>> | NULL)
<nodo> ::= <contenido> + <enlace>
<contenido> ::= <<dato>>{<<dato>>}
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 59
09/03/2022
Otras operaciones
• Al remover el ultimo elemento de una pila esta queda vacia
– Una vez vacia, no se pueden “sacar” mas elementos de la pila
• Antes de sacar un elemento de la pila
– Debemos saber si la pila Esta Vacia?: EstaVacia(s)
• El tope de la pila siempre esta cambiando
– Deberiamos poder “revisar” el elemento tope de la pila:
TopePila(s)
– Si la pila esta vacia, no debe existir un valor tope
• El tratar de remover elementos o acceder a elementos de una
pila vacia se llama
– SUBDESBORDAMIENTO de la pila
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 60
09/03/2022
Un aplicación mas práctica
• El compilador siempre sabe cuando se ha
escrito un paréntesis, o una llave de mas
– ¿Como lo hace?
• Con el uso de pilas, expresiones escritas:
– (a+b)) Mal
– ((a+b) * c / 4*g-h) OK
• Se puede reconocer los paréntesis que no
coinciden
– ¿Como lograr esta aplicación de la pila?
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 61
09/03/2022
Análisis del problema
• Cuando los paréntesis coinciden:
– Al final de la expresión
• Total paréntesis izq = Total parentesis der
– En todo momento, en cualquier punto de la expresión
• Cada paréntesis der. esta precedido de uno izq
• Acum. paréntesis der. siempre es <= que Acum. Paréntesis izq
• Por ejemplo:
7 - ((X* ((X+Y)/(J-3)) + Y) / (4-2.5))
(A+B)) + 3 Al final de la
expresion:
Total ( = 1
Total ) = 2
En este punto de la expresion, ya se sabe
que es incorrecta
Acum ( = 1
Acum ) = 2
No se cumple la regla
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 62
09/03/2022
Un enfoque natural
 Cuando revisamos una expresión de este tipo:
 Revisamos los paréntesis de la derecha, y buscamos sin tienen “match” en la
izquierda
 Para seguir este enfoque podríamos:
 “Recordar” los paréntesis de la izquierda ( a medida que aparecen:
 El primero en aparecer, será el ultimo en ser “recordado”
 El ultimo en aparecer, será el primero en ser “recordado”
La Pila se utiliza
justamente para
“recordar” de la forma
abajo indicada
Pop el
parentesis )
encontrado
7 - ((X* ((X+Y)/(J-3)) + Y) / (4-2.5))
 Asi, cuando aparece un )
 El primer ( recordado, debe ser su “match”
 En ese momento, este primero recordado, ya puede ser “olvidado”
 Al llegar al final de la expresion, ningun ( deberia ser “recordado”
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 63
09/03/2022
APLICANDO PILAS
 Veamos, revisemos justo la expresión anterior
Todos los ),
encontraron su (
7 - ( ( X *( ( X+Y) / ( J- 3) ) +Y) / ( 4- 2) )
(
(
(
(
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 64
09/03/2022
Y ahora, el algoritmo
Pila S; /*Se declara una pila s, para almacenar los ( */
Pila_Inicializar(&S);
while(no hayamos leido toda la cadena)
{
//tomar el siguiente simbolo de la expresion
if(simbolo = ‘(‘) /*Almacenarlo*/
Pila_Push(&S,simbolo);
if(simbolo = ‘)’){ /*Buscar match*/
if(Pila_EstaVacia(S)) { /*No hubo match!!*/
return(FALSE)
Pila_Pop(&s);
}
}
if(Pila_EstaVacia(s)) /*Algun simbolo se quedo dentro,
porque no hubo match*/
return TRUE;
Else
return FALSE;
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 65
09/03/2022
TDA Cola (Queue)
 Abunda este concepto, en la vida cotidiana
 Cuando vamos al cine, para comprar las entradas
 Cuando estamos en el supermercado, en el banco, etc.
 Como funciona
 Se puede decir que la cola tiene 2 extremos
 FRENTE, Y FINAL
 La computadora las utiliza:
 Para manejar la impresión de
documentos, tiempo compartido, etc.
Queue -> Cola
Cada documento
que se manda a
imprimir es
“encolado”, uno a
uno es enviado a
la impresora
Frente
Final
Final
Frente
 Todo el que llega se ubica al final de la cola
 Todo el que sale, lo hace por el frente de la cola
 La cola es por turno
 El primero en llegar, tiene la seguridad de que sera el
primero en salir:
 FIRST IN FIRST OUT -> FIFO
2
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 66
09/03/2022
Queues en un sistema informático
• Cuando un proceso (programa) requiere un
determinado recurso
– Impresora
– acceso al disco en una red
– caracteres en un keyboard buffer
• Operaciones de manipulación de colas
– isEmpty(): retorna true o false
– first(): retorna la copia del valor de la cabeza
– add(v): agrega un nuevo valor al final de la cola
– remove(): elimina, retorna valor de la cabeza
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 67
09/03/2022
Operaciones básicas
• Al suponer que existe un TDA Cola, podemos:
– Cola Q;
• Todo TDA presenta operaciones básicas, en este caso:
– EnColar
• Insertar un elemento nuevo a la cola, al final de la misma,
• El final aumenta
– DesEnColar
• Cuando un elemento es removido de la cola
• Remueve el elemento del frente
• Retorna el elemento removido
• No se puede ejecutar si la cola EstaVacia
• Asi como en la pila
– Cualquier intento de acceder a elementos en una Cola Vacía:
• SUBDESBORDAMIENTO DE LA COLA
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 68
09/03/2022
Implementación de colas con listas
enlazadas simples (SLL)
• In an SLL you can easily find the successor
of a node, but not its predecessor
– Remember, pointers (references) are one-way
• If you know where the last node in a list is,
it’s hard to remove that node, but it’s easy
to add a node after it
• Hence,
– Use the first element in an SLL as the front of
the queue
– Use the last element in an SLL as the rear of
the queue
– Keep pointers to both the front and the rear of
the SLL
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 69
09/03/2022
Estructura Queue
myHead mySize myTail
n
aQueue
. . .
. . .
value0 value1 valuen-1
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 70
09/03/2022
Encolando un nodo
Para encolar (add) un nodo:
Encuentra el actual último nodo
Cámbielo para que apunte al nuevo último nodo
Cambiar el último puntero en el encabezado de la lista
17
Nodo a ser
encolado
23
44
last
first
97
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 71
09/03/2022
Desencolando un nodo
• Para desencolar (remove) un nodo:
– Copiar el puntero del primer nodo en el
encabezado
44 97 23 17
last
first
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 72
09/03/2022
Métodos de clase Queue
• Constructor
– set myHead, myTail to null
– set mySize to zero
• isEmpty()
– return results of comparison mySize == 0
• front()
– return myHead.getValue()
// unless empty
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 73
09/03/2022
Métodos de clase Queue
• add()
– create new node, update attribute variables
– if queue is empty, must also update myHead
• remove()
– must check if class not empty
otherwise …
– save handle to first object
– adjust head to refer to node
– update mySize
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 74
09/03/2022
Deques
• Un deque es un double-ended queue
• Las inserciones y eliminaciones pueden
ocurrir en cualquier extremo
• La implementación es similar a la de las
colas
• Los deques no se utilizan mucho
• Deberías saber qué es un deque, pero no
los exploraremos mucho más.
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 75
09/03/2022
Contenido
• Listas enlazadas
– Conceptos generales
– Representación gráfica
– Estructura de lista enlazada: Clase Lista y constructor nodo de la
lista
• Clasificación de listas enlazadas
– Simples, dobles, circulares
– Operaciones básicas: Insertar, buscar, eliminar, recorrido
– Operaciones adicionales: Pilas y colas
• Colecciones genéricas e Iteradores
– Colección List <T> – Listas,
– Stack <T> – Pilas,
– Queue <T> – Colas
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 76
09/03/2022
La interfaz Collection
• Excluye
– add(int, E)
– get(int)
– remove(int)
– set(int, E)
• Pero incluye
– add(E)
– remove(Object)
– El método iterator
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 77
09/03/2022
The Collection Framework
<<interface>>
Iterable<
<<interface>>
Collection
<<interface>>
Queue<
<<interface>>
List<
AbstractCollection
<<interface>>
Set
<<interface>>
Deque
AbstractList AbstractSet
<<interface>>
SortedSet
AbstractSequential
List
Vector ArrayList HashSet
<<interface>>
NavigableSet<
TreeSet
ConcurrentSkipListSet
LinkedList Stack
LinkedHashSe
t
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 78
09/03/2022
Características comunes de las colecciones
• crecen según sea necesario
• tienen referencias a objetos
• al menos dos constructores
– uno para crear una colección vacía
– uno para hacer una copia de otra colección
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 79
09/03/2022
Características comunes de las colecciones
general Collection
 el orden de los elementos no está especificado
Colecciones que implementan la interfaz List
 el orden de los elementos está determinado por el índice
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 80
09/03/2022
Características comunes de las colecciones
 Para una Collection general
 la posición donde se inserta un objeto no es especificada
 Pero para ArrayList y LinkedList
 add(E) siempre inserta al final y siempre retorna true
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 81
09/03/2022
Contenido
• Listas enlazadas
– Conceptos generales
– Representación gráfica
– Estructura de lista enlazada: Clase Lista y constructor nodo de la
lista
• Clasificación de listas enlazadas
– Simples, dobles, circulares
– Operaciones básicas: Insertar, buscar, eliminar, recorrido
– Operaciones adicionales: Pilas y colas
• Colecciones genéricas e Iteradores
– Colección List <T> – Listas,
– Stack <T> – Pilas,
– Queue <T> – Colas
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 82
09/03/2022
Interfaz java.util.List y sus
implementaciones
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 83
09/03/2022
La clase LinkedList
• Dado
LinkedList alist = new LinkedList();
. . .
aList.add(new(integer(88));
aList.add(new(integer(77));
aList.add(new(integer(66));
Objeto resultante
mostrado a la
izquierda
aList
head size tail
3
66
88 77
https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 84
09/03/2022
Recordando: Variaciones en listas enlazadas
• Las listas se pueden enlazar doblemente
como se muestra en la figura anterior
• Las listas también se pueden enlazar en una
sola dirección
– El atributo podría no necesitar un enlace a la cola
– El nodo necesita un enlace hacia adelante y un
puntero solo a los datos.
– El último elemento de la lista tiene un enlace
establecido en nulo
• Las listas se pueden enlazar circularmente
– El último nodo tiene un enlace al primer nodo
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 85
09/03/2022
Usando la clase LinkedList
• Dado
LinkedList addressSequence = new LinkedList();
• Use el constructor de una LinkedList
para construir una lista vacía
head size tail
0
addressSequence
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 86
09/03/2022
Agregar nodos a la lista vinculada
• Resultados del comando para la primera
adición de nodos a la lista
addressSequence.add(anAddressCounter);
head size tail
0
addressSequence
123.111.345.444, 1
Sucesivas adiciones…
•Crean más nodos y valores de datos
•Ajustan enlaces
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 87
09/03/2022
Acceder a valores en una LinkedList
• Debe usarse el método .get
((AddressCounter)addresssSequence.get(index)).incrementCount();
• Una LinkedList no tiene una matriz con un índice
para acceder a un elemento
• El método get debe …
– Iniciar en el nodo head cabecera
– iterar a través de los nodos index para encontrar
coincidencias
– devolver la referencia del objeto en ese nodo
• La sentencia luego hace cast y incrementCount()
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 88
09/03/2022
Acceder a valores en una LinkedList
• Para imprimir valores sucesivos para la salida
for (int i = 0; i < addressSequence.size(); i++)
System.out.println(addressSequence.get(i));
size method determina el
límite del contador del ciclo
for
get(i) inicia en el
primer nodo, itera i
veces para alcanzar el
nodo deseado
•Note que cada get(i) debe pasar sobre los mismos primeros i-1
nodos previamente accesados -> O(n2)
•¡Esto es ineficiente!
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 89
09/03/2022
Acceder a valores en una LinkedList
• Alternativa: algoritmo con acceso más eficiente
ListIterator it = addressSequence.listIterator();
while (it.hasNext())
System.out.println( it.next());
• ListIterator es un objeto que itera a través
de los valores en una lista
• El método next() hace lo siguiente:
1. guarda el identificador en el objeto del nodo actual
2. avanza el iterador al siguiente nodo usando el atributo
sucesor
3. devuelve el identificador guardado en el paso 1, por lo
que el objeto al que se apunta se puede generar
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 90
09/03/2022
El Iterador (Iterator)
• Un iterador se puede ver como un marcador de lugar
en movimiento que realiza un seguimiento de la
posición actual en una lista enlazada en particular.
• Un objeto iterador para una lista comienza en el
primer nodo
• El programador puede mover el iterador llamando a su
método next()
• El iterador permanece en su elemento de lista actual
hasta que es necesitado
• Un iterador recorre la lista en O(n) mientras que un
recorrido de lista que usa llamadas get() en una lista
vinculada es O(n2)
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 91
09/03/2022
Insertar nodos en cualquier lugar de
una lista enlazada
• Recordar problema con ArrayList
– se puede agregar solo al final de la lista
– LinkedList tiene capacidad para insertar nodos en
cualquier lugar
• Nosotros podemos decir
addressSequence.add(n, new AddressCounter());
lo cual hará…
– construir un nuevo nodo
– actualizar enlaces a head y tail si es necesario
– actualizar los enlaces del controlador de nodo para
colocar el nuevo nodo en el n-ésimo elemento de la lista
– asignar memoria para el elemento de datos
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 92
09/03/2022
La clase LinkedList
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 93
09/03/2022
Interface Iterator
• La interface Iterator está definida en java.util
• La interface List a el método iterator, el cual
retorna un objeto Iterator que itera sobre los
elementos de esa lista
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 94
09/03/2022
Eliminación de elementos usando Iterator (1)
• Puedes usar el método remove() para eliminar
elementos de una lista a medida que accede a
ellos
• remove() elimina el elemento más reciente
retornado (devuelto)
• Debe llamar a next() antes de cada
remove(); de lo contrario, se lanzará una
IllegalStateException
• Para eliminar todos los elementos de una lista de
tipo Integer que son divisibles por un valor
particular…
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 95
09/03/2022
Eliminación de elementos usando Iterator (2)
public static void removeDivisibleBy(LinkedList<Integer>
aList, int div)
{
Iterator<Integer> iter = aList.iterator();
while (iter.hasNext()) {
int nextInt = iter.next();
if (nextInt % div == 0) {
iter.remove();
}
}
}
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 96
09/03/2022
Interface ListIterator (1)
• Iterator limitations
– Traverses List only in the forward direction
– Provides a remove method, but no add
method
– You must advance the Iterator using your
own loop if you do not start from the
beginning of the list
• ListIterator extends Iterator,
overcoming these limitations
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 97
09/03/2022
Interface ListIterator (2)
• Limitaciones del Iterator
– Se recorre la lista solo en dirección hacia adelante
– Proporciona un método remove, pero no un método
add.
– Debe avanzar el Iterator usando su propio bucle si
no comienza desde el principio de la lista
• ListIterator extiende Iterator, superando
estas limitaciones
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 98
09/03/2022
Interface ListIterator (3)
• Al igual que con Iterator, ListIterator se
posiciona conceptualmente entre los elementos de
la lista
• Las posiciones ListIterator van de 0 a size
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 99
09/03/2022
Interface ListIterator (4)
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 100
09/03/2022
Interface ListIterator (5)
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 101
09/03/2022
Comparación entre Iterator y
ListIterator
• ListIterator es una subinterface de Iterator
– Las clases que implementen ListIterator deben
proporcionar las características de ambos
• Iterator:
– Requiere menos métodos
– Puede iterar sobre estructuras de datos más generales
• Iterator es requerido por la interfaz Collection
– ListIterator es requerido solo por la interfaz List
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 102
09/03/2022
Conversión entre ListIterator y un
Index (1)
• ListIterator:
– nextIndex()retorna el index del item a ser
retornado por next()
– previousIndex() retorna el index del item a
ser retornado por previous()
• LinkedList dispone del método listIterator(int
index)
– Retorna un ListIterator posicionado de
manera que next()retornará el item de la
posición index
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 103
09/03/2022
Conversión entre ListIterator y un
Index (2)
• El método listIterator (int index)
crea un nuevo ListIterator que
empieza en el inicio, y recorre la lista
hasta la posición deseada – generalmente
se trata de una operación O(n)
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 104
09/03/2022
Mejora en declaración for(1)
• Java 5.0 introduce una mejora para la declaración for
• La mejora en la declaración for crea un objeto
Iterator e implícitamente llama a los métodos
hasNext y next
• Otros métodos Iterator, como remove, no están
disponibles
• El Código siguiente contabiliza el número de veces
que target aparece en myList (type
LinkedList<String>)
count = 0;
for (String nextStr : myList) {
if (target.equals(nextStr)) {
count++;
}
}
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 105
09/03/2022
Mejora en declaración for(2)
• En la lista myList de tipo type
LinkedList<Integer>, cada objeto Integer
es automaticamente desempaquetado:
sum = 0;
for (int nextInt : myList) {
sum += nextInt;
}
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 106
09/03/2022
Mejora en declaración for(3)
• La instrucción for mejorada también se puede
usar con matrices, en este caso, chars o type
char[]
for (char nextCh : chars) {
System.out.println(nextCh);
}
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 107
09/03/2022
Interface Iterable
Each class that implements the List interface must
provide an iterator method
The Collection interface extends the Iterable
interface
All classes that implement the List interface (a
subinterface of Collection) must provide an iterator
method
Allows use of the Java 5.0 for-each loop
public interface Iterable<E> {
/** returns an iterator over the elements in this
collection. */
Iterator<E> iterator();
}
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 108
09/03/2022
Ejemplo de uso LinkedList
import java.util.*;
public class LinkedList1{
public static void main(String args[]){
LinkedList<String> al=new LinkedList<String>();
al.add("Ravi");
al.add("Vijay");
al.add("Ravi");
al.add("Ajay");
Iterator<String> itr=al.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}
}
}
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 109
09/03/2022
Ejemplo
LinkedList
para
agregar
elementos
import java.util.*;
public class LinkedList2{
public static void main(String args[]){
LinkedList<String> ll=new LinkedList<String>();
System.out.println("Initial list of elements: "+ll);
ll.add("Ravi");
ll.add("Vijay");
ll.add("Ajay");
System.out.println("After invoking add(E e) method: "+ll);
//Adding an element at the specific position
ll.add(1, "Gaurav");
System.out.println("After invoking add(int index, E element) method: "+ll);
LinkedList<String> ll2=new LinkedList<String>();
ll2.add("Sonoo");
ll2.add("Hanumat");
//Adding second list elements to the first list
ll.addAll(ll2);
System.out.println("After invoking addAll(Collection<? extends E> c) method: "+ll);
LinkedList<String> ll3=new LinkedList<String>();
ll3.add("John");
ll3.add("Rahul");
//Adding second list elements to the first list at specific position
ll.addAll(1, ll3);
System.out.println("After invoking addAll(int index, Collection<? extends E> c) method: "+ll);
//Adding an element at the first position
ll.addFirst("Lokesh");
System.out.println("After invoking addFirst(E e) method: "+ll);
//Adding an element at the last position
ll.addLast("Harsh");
System.out.println("After invoking addLast(E e) method: "+ll);
}
}
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 110
09/03/2022
Ejemplo
LinkedList
para
remover
elementos
import java.util.*;
public class LinkedList3 {
public static void main(String [] args) {
LinkedList<String> ll=new LinkedList<String>();
ll.add("Ravi"); ll.add("Vijay"); ll.add("Ajay"); ll.add("Anuj"); ll.add("Gaurav"); ll.add("Harsh"); ll.add("Virat");
ll.add("Gaurav"); ll.add("Harsh"); ll.add("Amit");
System.out.println("Initial list of elements: "+ll);
//Removing specific element from arraylist
ll.remove("Vijay");
System.out.println("After invoking remove(object) method: "+ll);
//Removing element on the basis of specific position
ll.remove(0);
System.out.println("After invoking remove(index) method: "+ll);
LinkedList<String> ll2=new LinkedList<String>();
ll2.add("Ravi");
ll2.add("Hanumat");
// Adding new elements to arraylist
ll.addAll(ll2);
System.out.println("Updated list : "+ll);
//Removing all the new elements from arraylist
ll.removeAll(ll2);
System.out.println("After invoking removeAll() method: "+ll);
//Removing first element from the list
ll.removeFirst();
System.out.println("After invoking removeFirst() method: "+ll);
//Removing first element from the list
ll.removeLast();
System.out.println("After invoking removeLast() method: "+ll);
//Removing first occurrence of element from the list
ll.removeFirstOccurrence("Gaurav");
System.out.println("After invoking removeFirstOccurrence() method: "+ll);
//Removing last occurrence of element from the list
ll.removeLastOccurrence("Harsh");
System.out.println("After invoking removeLastOccurrence() method: "+ll);
//Removing all the elements available in the list
ll.clear();
System.out.println("After invoking clear() method: "+ll);
}
}
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 111
09/03/2022
Ejemplo LinkedList para invertir una
lista de elementos
import java.util.*;
public class LinkedList4{
public static void main(String args[]){
LinkedList<String> ll=new LinkedList<String>();
ll.add("Ravi");
ll.add("Vijay");
ll.add("Ajay");
//Traversing the list of elements in reverse order
Iterator i=ll.descendingIterator();
while(i.hasNext())
{
System.out.println(i.next());
}
}
}
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 112
09/03/2022
Ejemplo de Java LinkedList: Libro
import java.util.*;
class Book {
int id;
String name,author,publisher;
int quantity;
public Book(int id, String name, String author, Strin
g publisher, int quantity) {
this.id = id;
this.name = name;
this.author = author;
this.publisher = publisher;
this.quantity = quantity;
}
}
}
public class LinkedListExample {
public static void main(String[] args) {
//Creating list of Books
List<Book> list=new LinkedList<Book>();
//Creating Books
Book b1=new Book(101,"Let us C","Yashwant Kanetkar","BPB",8);
Book b2=new Book(102,"Data Communications & Networking",
"Forouzan","Mc Graw Hill",4);
Book b3=new Book(103,"Operating System","Galvin","Wiley",6);
//Adding Books to list
list.add(b1);
list.add(b2);
list.add(b3);
//Traversing list
for(Book b:list){
System.out.println(b.id+" "+b.name+" "+b.author+" "+b.publisher+"
"+b.quantity);
}
}
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 113
09/03/2022
Contenido
• Listas enlazadas
– Conceptos generales
– Representación gráfica
– Estructura de lista enlazada: Clase Lista y constructor nodo de la
lista
• Clasificación de listas enlazadas
– Simples, dobles, circulares
– Operaciones básicas: Insertar, buscar, eliminar, recorrido
– Operaciones adicionales: Pilas y colas
• Colecciones genéricas e Iteradores
– Colección List <T> – Listas,
– Stack <T> – Pilas,
– Queue <T> – Colas
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 114
09/03/2022
Clase Stack de Java
• Java tiene una clase Stack que extiende la
clase Vector
• El autor señala que la implementación como
una subclase de Vector proporciona herencia
de métodos inapropiados para una pila (Stack)
– esto viola la regla de oro para el uso de la extensión
– Vector contiene mensajes no apropiados que no
deben usarse en Stack
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 115
09/03/2022
java.util.Stack
• El TDA Stack, como se indica en
java.util.Stack:
– Stack(): método constructor
– boolean empty() (pero tambien hereda isEmpty())
– Object push(Object item)
– Object peek(): devuelve el elemento que esta en la
cima de la pila
– Object pop()
– int search(Object o): Devuelve la 1-based posición
del objeto en la pila
• 1-based, inclusive start, inclusive end
– Describing entire sequence : start = 1, end = 8 Ej:[1,2,3,4,5,6,7,8]
• 0-based, inclusive start, exclusive end
– Describing entire sequence: start = 0, end = 8 Ej: [0,1,2,3,4,5,6,7]
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 116
09/03/2022
Ejemplo de uso
//Pilas: Comandos basicos (push, pop, peek, empty)
package pilas;
import java.util.Stack;
public class Pilas {
public static void main(String[] args) {
Stack < String > pila = new Stack < String > ();
//apila 3 elementos
pila.push("elemento1");
pila.push("elemento2");
pila.push("elemento3");
System.out.println("1- push: " + pila);
//retira elemento que esta en la cima de la pila
pila.pop();
System.out.println("2- pop: " + pila);
//devuelve el elemento que esta en la cima de la pila
String x = pila.peek();
System.out.println("3- peek: " + x);
//devuelve cierto si la pila esta vacia
boolean y = pila.empty();
System.out.println("4- empty: " + y);
}
}
run:
1- push: [elemento1, elemento2, elemento3]
2- pop: [elemento1, elemento2]
3- peek: elemento2
4- empty: false
BUILD SUCCESSFUL (total time: 0 seconds)
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 117
09/03/2022
Contenido
• Listas enlazadas
– Conceptos generales
– Representación gráfica
– Estructura de lista enlazada: Clase Lista y constructor nodo de la
lista
• Clasificación de listas enlazadas
– Simples, dobles, circulares
– Operaciones básicas: Insertar, buscar, eliminar, recorrido
– Operaciones adicionales: Pilas y colas
• Colecciones genéricas e Iteradores
– Colección List <T> – Listas,
– Stack <T> – Pilas,
– Queue <T> – Colas
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 118
09/03/2022
java.util Interface Queue<E>
• Java provides a queue interface and several implementations
• boolean add(E e)
– Inserts the specified element into this queue if it is possible to do so
immediately without violating capacity restrictions, returning true upon
success and throwing an IllegalStateException if no space is currently
available.
• E element()
– Retrieves, but does not remove, the head of this queue.
• boolean offer(E e)
– Inserts the specified element into this queue if it is possible to do so
immediately without violating capacity restrictions.
• E peek()
– Retrieves, but does not remove, the head of this queue, or returns null if
this queue is empty.
• E poll()
– Retrieves and removes the head of this queue, or returns null if this queue
is empty.
• E remove()
– Retrieves and removes the head of this queue.
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 119
09/03/2022
Java Queue Implementations (1)
• Dado que Queue es una interfaz, debe crear una instancia de
una implementación concreta de la interfaz para poder usarla.
Puede elegir entre las siguientes implementaciones de cola
en la API de colecciones de Java:
– java.util.LinkedList
– java.util.PriorityQueue
• LinkedList es una implementación de cola bastante
estándar.
– Los elementos de la cola se almacenan internamente en una
estructura de datos de lista vinculada estándar.
– Esto hace que sea más rápido insertar elementos al final (cola)
de la lista y eliminar elementos del principio (encabezado) de la
lista.
• PriorityQueue almacena sus elementos internamente de
acuerdo con su orden natural (si implementan Comparable),
o de acuerdo con un Comparator pasado a
PriorityQueue.
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 120
09/03/2022
Java Queue Implementations (2)
• A continuación, se muestran algunos ejemplos de
cómo crear una instancia de cola:
• En la mayoría de las implementaciones de cola, el
principio y el final de la cola se encuentran en
extremos opuestos. Sin embargo, es posible
implementar la interfaz de cola de modo que la
cabeza y la cola de la cola estén en el mismo
extremo. En ese caso, tendrías una pila.
Queue queueA = new LinkedList();
Queue queueB = new PriorityQueue();
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 121
09/03/2022
Generic Queue
• De forma predeterminada, puede poner cualquier objeto en una
cola, pero desde Java 5, Java Generics permite limitar los tipos de
objetos que puede insertar en una cola. Aquí hay un ejemplo:
• Esta cola ahora solo puede tener instancias de MyObject insertadas
en ella. A continuación, puede acceder e iterar sus elementos sin
convertirlos. Así es como se ve:
Queue<MyObject> queue = new LinkedList<MyObject>();
Queue<MyObject> queue = new LinkedList<MyObject>();
MyObject myObject = queue.remove();
for(MyObject anObject : queue){
//do someting to anObject...
}
Observe cómo no se necesita conversión en la primera línea y cómo el bucle for-each
puede convertir cada elemento de la cola directamente en una instancia de MyObject.
Esto es posible porque la cola se creó con MyObject como tipo genérico.
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 122
09/03/2022
Add Element to Queue
• La interfaz de la cola de Java contiene dos métodos que
puede utilizar para agregar elementos a una cola. Estos
métodos son el método add () y el método offer ().
• Estos dos métodos agregan un elemento al final de la cola.
• Los métodos add () y offer () difieren en cómo se comportan
si la cola está llena, por lo que no se pueden agregar más
elementos.
• El método add () arroja una excepción en ese caso, mientras
que el método offer () solo devuelve falso.
• Aquí hay dos ejemplos de cómo agregar elementos a una
cola de Java a través de sus métodos add () y offer ():
Queue<String> queue = new LinkedList<>();
queue.add("element 1");
queue.offer("element 2");
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 123
09/03/2022
Take Element From Queue
• Para tomar un elemento de una cola de Java, puede llamar a
su método poll () o remove (). Ambos eliminan el primer
elemento de la cola.
• Se diferencian en cómo se comportan si la cola está vacía.
• El método poll () devuelve un valor nulo si la cola está vacía.
• El método remove () genera una excepción si la cola está
vacía.
• Aquí hay dos ejemplos de cómo tomar un elemento de una
cola de Java usando sus métodos poll () y remove ():
Queue<String> queue = new LinkedList<>();
queue.add("element 1");
queue.add("element 2");
String element1 = queue.poll();
String element2 = queue.remove();
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 124
09/03/2022
Peek at the Queue (1)
• Puede echar un vistazo al elemento al principio de una cola
sin sacar el elemento de la cola. Esto se hace a través de los
métodos element () o peek ().
• El método element () devuelve el primer elemento de la cola.
Si la Cola está vacía, el método element () arroja una
NoSuchElementException.
• A continuación, se muestra un ejemplo de cómo mirar el
primer elemento de una cola de Java utilizando el método
element ():
Queue<String> queue = new LinkedList<>();
queue.add("element 1");
queue.add("element 2");
queue.add("element 3");
String firstElement = queue.element();
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 125
09/03/2022
Peek at the Queue (2)
• El método peek () funciona como el método element ()
excepto que no lanza una excepción si la Cola está
vacía. En su lugar, solo devuelve nulo.
• A continuación, se muestra un ejemplo de cómo mirar el
primer elemento de una cola utilizando el método peek ():
Queue<String> queue = new LinkedList<>();
queue.add("element 1");
queue.add("element 2");
queue.add("element 3");
String firstElement = queue.peek();
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 126
09/03/2022
Remove Element From Queue
• Para eliminar elementos de una cola de Java,
llame al método remove (). Este método elimina el
elemento al principio de la cola.
• A continuación, se muestra un ejemplo de cómo
eliminar un elemento de una cola de Java:
Queue<String> queue = new LinkedList<>();
queue.add("element 0");
queue.add("element 1");
String removedElement = queue.remove();
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 127
09/03/2022
Remove All Elements From Queue
• Puede eliminar todos los elementos de una cola de Java
utilizando su método clear ().
• El método clear () en realidad se hereda de la interfaz
Collection.
• Aquí hay un ejemplo de cómo eliminar todos los elementos
de una cola de Java a través de su método clear ():
queue.clear();
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 128
09/03/2022
Get Queue Size
• Puede leer la cantidad de elementos almacenados
en una cola de Java a través de su método size ().
• Aquí hay un ejemplo de cómo obtener el tamaño
de una cola de Java a través de su método size ():
Queue<String> queue = new LinkedList<>();
queue.add("element 1");
queue.add("element 2");
queue.add("element 3");
int size = queue.size();
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 129
09/03/2022
Check if Queue Contains Element
• Puede comprobar si una cola de Java contiene un
determinado elemento a través de su método contains ().
• El método contains () devolverá verdadero si la cola contiene
el elemento dado, y falso si no.
• El método contains () en realidad se hereda de la interfaz
Collection, pero en la práctica eso no importa.
• A continuación, se muestran dos ejemplos de comprobación
de si una cola de Java contiene un elemento determinado:
Queue<String> queue = new LinkedList<>();
queue.add("Mazda");
boolean containsMazda = queue.contains("Mazda");
boolean containsHonda = queue.contains("Honda");
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 130
09/03/2022
Iterate All Elements in Queue
• También puede iterar todos los elementos de una cola
de Java, en lugar de solo procesar uno a la vez.
• A continuación, se muestra un ejemplo de iteración de
todos los elementos en una cola de Java:
Queue<String> queue = new LinkedList<>();
queue.add("element 0");
queue.add("element 1");
queue.add("element 2");
//access via Iterator
Iterator<String> iterator = queue.iterator();
while(iterator.hasNext(){
String element = iterator.next();
}
//access via new for-loop
for(String element : queue) {
//do something with each element
}
Cuando se itera una cola a
través de su iterador o
mediante el bucle for-each
(que también usa el
iterador detrás de la
escena), la secuencia en la
que se iteran los elementos
depende de la
implementación de la cola.
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 131
09/03/2022
java.util Interface Deque<E>
• Java 6 now has a Deque interface
• There are 12 methods:
– Add, remove, or examine an element...
– ...at the head or the tail of the queue...
– ...and either throw an exception, or return a special value
(null or false) if the operation fails
Estructuras de datos Carrera de Software
Ph.D. Franklin Parrales 132
09/03/2022
Estructuras de datos lineales
(listas)
Unidad 3
Final de la unidad

Más contenido relacionado

La actualidad más candente

Listas como estructura de datos..
Listas como estructura de datos..Listas como estructura de datos..
Listas como estructura de datos..NANO-06
 
Normalizacion de bases de datos
Normalizacion de bases de datosNormalizacion de bases de datos
Normalizacion de bases de datosCaro_Noirgean
 
Arboles - estructura de datos
Arboles - estructura de datos Arboles - estructura de datos
Arboles - estructura de datos Kaneki04
 
Estructura del almacenamiento Mili Dutruel
Estructura del almacenamiento Mili DutruelEstructura del almacenamiento Mili Dutruel
Estructura del almacenamiento Mili DutruelMilagrosDutruel
 
Modelo Relacional (Base de Datos)
Modelo Relacional (Base de Datos)Modelo Relacional (Base de Datos)
Modelo Relacional (Base de Datos)Neguib Núñez
 
SO Unidad 1: Introducción a los Sistemas Operativos
SO Unidad 1: Introducción a los Sistemas OperativosSO Unidad 1: Introducción a los Sistemas Operativos
SO Unidad 1: Introducción a los Sistemas OperativosFranklin Parrales Bravo
 
Enfoque estructurado y Enfoque OO - Ingenieria de software
Enfoque estructurado y Enfoque OO  - Ingenieria de softwareEnfoque estructurado y Enfoque OO  - Ingenieria de software
Enfoque estructurado y Enfoque OO - Ingenieria de softwareKola Real
 
Metodos de ordenamiento 2
Metodos de ordenamiento 2Metodos de ordenamiento 2
Metodos de ordenamiento 2angela montilla
 
Estructura de datos - Unidad 1: Introducción a las estructuras de datos
Estructura de datos - Unidad 1: Introducción a las estructuras de datosEstructura de datos - Unidad 1: Introducción a las estructuras de datos
Estructura de datos - Unidad 1: Introducción a las estructuras de datosJosé Antonio Sandoval Acosta
 
Estructura de Datos - Unidad 4 Estructuras no lineales
Estructura de Datos - Unidad 4 Estructuras no linealesEstructura de Datos - Unidad 4 Estructuras no lineales
Estructura de Datos - Unidad 4 Estructuras no linealesJosé Antonio Sandoval Acosta
 
Unidad 1. Fundamentos de Base de Datos
Unidad 1. Fundamentos de Base de DatosUnidad 1. Fundamentos de Base de Datos
Unidad 1. Fundamentos de Base de Datoshugodanielgd
 
Unidad 3 Modelamiento De Datos Conceptual
Unidad 3 Modelamiento De Datos ConceptualUnidad 3 Modelamiento De Datos Conceptual
Unidad 3 Modelamiento De Datos ConceptualSergio Sanchez
 
Estructura de Datos Unidad - V: Métodos de Ordenamiento
Estructura de Datos Unidad - V: Métodos de OrdenamientoEstructura de Datos Unidad - V: Métodos de Ordenamiento
Estructura de Datos Unidad - V: Métodos de OrdenamientoJosé Antonio Sandoval Acosta
 
Manejo de archivos en JAVA
Manejo de archivos en JAVAManejo de archivos en JAVA
Manejo de archivos en JAVAMichelle Torres
 

La actualidad más candente (20)

Indexación de archivos simple
Indexación de archivos simpleIndexación de archivos simple
Indexación de archivos simple
 
Listas como estructura de datos..
Listas como estructura de datos..Listas como estructura de datos..
Listas como estructura de datos..
 
Normalizacion de bases de datos
Normalizacion de bases de datosNormalizacion de bases de datos
Normalizacion de bases de datos
 
Árboles Multicamino, B y B+
Árboles Multicamino, B y B+Árboles Multicamino, B y B+
Árboles Multicamino, B y B+
 
Arboles - estructura de datos
Arboles - estructura de datos Arboles - estructura de datos
Arboles - estructura de datos
 
Estructura del almacenamiento Mili Dutruel
Estructura del almacenamiento Mili DutruelEstructura del almacenamiento Mili Dutruel
Estructura del almacenamiento Mili Dutruel
 
Estructura de Datos - Unidad 6 Metodos de busqueda
Estructura de Datos - Unidad 6 Metodos de busquedaEstructura de Datos - Unidad 6 Metodos de busqueda
Estructura de Datos - Unidad 6 Metodos de busqueda
 
Modelo Relacional (Base de Datos)
Modelo Relacional (Base de Datos)Modelo Relacional (Base de Datos)
Modelo Relacional (Base de Datos)
 
Búsqueda Binaria
Búsqueda BinariaBúsqueda Binaria
Búsqueda Binaria
 
SO Unidad 1: Introducción a los Sistemas Operativos
SO Unidad 1: Introducción a los Sistemas OperativosSO Unidad 1: Introducción a los Sistemas Operativos
SO Unidad 1: Introducción a los Sistemas Operativos
 
Listas
ListasListas
Listas
 
Enfoque estructurado y Enfoque OO - Ingenieria de software
Enfoque estructurado y Enfoque OO  - Ingenieria de softwareEnfoque estructurado y Enfoque OO  - Ingenieria de software
Enfoque estructurado y Enfoque OO - Ingenieria de software
 
Ordenamiento parte 2
Ordenamiento parte 2Ordenamiento parte 2
Ordenamiento parte 2
 
Metodos de ordenamiento 2
Metodos de ordenamiento 2Metodos de ordenamiento 2
Metodos de ordenamiento 2
 
Estructura de datos - Unidad 1: Introducción a las estructuras de datos
Estructura de datos - Unidad 1: Introducción a las estructuras de datosEstructura de datos - Unidad 1: Introducción a las estructuras de datos
Estructura de datos - Unidad 1: Introducción a las estructuras de datos
 
Estructura de Datos - Unidad 4 Estructuras no lineales
Estructura de Datos - Unidad 4 Estructuras no linealesEstructura de Datos - Unidad 4 Estructuras no lineales
Estructura de Datos - Unidad 4 Estructuras no lineales
 
Unidad 1. Fundamentos de Base de Datos
Unidad 1. Fundamentos de Base de DatosUnidad 1. Fundamentos de Base de Datos
Unidad 1. Fundamentos de Base de Datos
 
Unidad 3 Modelamiento De Datos Conceptual
Unidad 3 Modelamiento De Datos ConceptualUnidad 3 Modelamiento De Datos Conceptual
Unidad 3 Modelamiento De Datos Conceptual
 
Estructura de Datos Unidad - V: Métodos de Ordenamiento
Estructura de Datos Unidad - V: Métodos de OrdenamientoEstructura de Datos Unidad - V: Métodos de Ordenamiento
Estructura de Datos Unidad - V: Métodos de Ordenamiento
 
Manejo de archivos en JAVA
Manejo de archivos en JAVAManejo de archivos en JAVA
Manejo de archivos en JAVA
 

Similar a ED Unidad 3: Estructuras de datos lineales (listas)

Similar a ED Unidad 3: Estructuras de datos lineales (listas) (20)

Estructuras de datos lineales
Estructuras de datos linealesEstructuras de datos lineales
Estructuras de datos lineales
 
Curso basico c sharp iv
Curso basico c sharp   ivCurso basico c sharp   iv
Curso basico c sharp iv
 
Prog i estructura_datos_guia_3
Prog i estructura_datos_guia_3Prog i estructura_datos_guia_3
Prog i estructura_datos_guia_3
 
Informe de Lista.pdf
Informe de Lista.pdfInforme de Lista.pdf
Informe de Lista.pdf
 
Abd manejo memoria III
Abd manejo memoria IIIAbd manejo memoria III
Abd manejo memoria III
 
05 listas1 t2018
05 listas1 t201805 listas1 t2018
05 listas1 t2018
 
Organizacin secuencialindexadaencadenada
Organizacin secuencialindexadaencadenadaOrganizacin secuencialindexadaencadenada
Organizacin secuencialindexadaencadenada
 
Examen de recuperacion Betriz Cruz Granados
Examen de recuperacion Betriz Cruz GranadosExamen de recuperacion Betriz Cruz Granados
Examen de recuperacion Betriz Cruz Granados
 
Examen de recuperacion maestra yolanda
Examen de recuperacion maestra yolandaExamen de recuperacion maestra yolanda
Examen de recuperacion maestra yolanda
 
ESTRUCTURA DE DATOS Pilas y colas.pdf
ESTRUCTURA DE DATOS Pilas y colas.pdfESTRUCTURA DE DATOS Pilas y colas.pdf
ESTRUCTURA DE DATOS Pilas y colas.pdf
 
Presentaciones base de datos , fundamentos de base de datos
Presentaciones base de datos , fundamentos de base de datosPresentaciones base de datos , fundamentos de base de datos
Presentaciones base de datos , fundamentos de base de datos
 
Bases de datos.pptx
Bases de datos.pptxBases de datos.pptx
Bases de datos.pptx
 
Estructuras de tados
Estructuras de tadosEstructuras de tados
Estructuras de tados
 
LISTAS JAVA
LISTAS JAVALISTAS JAVA
LISTAS JAVA
 
Lista,pilas y columnas
Lista,pilas y columnasLista,pilas y columnas
Lista,pilas y columnas
 
Estructura de Datos
Estructura de DatosEstructura de Datos
Estructura de Datos
 
Base de datos
Base de datosBase de datos
Base de datos
 
Modelo de datos
Modelo de datosModelo de datos
Modelo de datos
 
Base de datos
Base de datosBase de datos
Base de datos
 
Diapositiva_BD_Unidad_02_TES.pdf
Diapositiva_BD_Unidad_02_TES.pdfDiapositiva_BD_Unidad_02_TES.pdf
Diapositiva_BD_Unidad_02_TES.pdf
 

Más de Franklin Parrales Bravo

Presentacion del congreso ETCM del 2021 en Cuenca
Presentacion del congreso ETCM del 2021 en CuencaPresentacion del congreso ETCM del 2021 en Cuenca
Presentacion del congreso ETCM del 2021 en CuencaFranklin Parrales Bravo
 
IW Unidad 1: Introducción a la Ingeniería Web
IW Unidad 1: Introducción a la Ingeniería WebIW Unidad 1: Introducción a la Ingeniería Web
IW Unidad 1: Introducción a la Ingeniería WebFranklin Parrales Bravo
 
IW Unidad 4: Web accesible, semántica y ubicua
IW Unidad 4: Web accesible, semántica y ubicuaIW Unidad 4: Web accesible, semántica y ubicua
IW Unidad 4: Web accesible, semántica y ubicuaFranklin Parrales Bravo
 
IW Unidad 3: Ingeniería Web dirigida por modelos
IW Unidad 3: Ingeniería Web dirigida por modelosIW Unidad 3: Ingeniería Web dirigida por modelos
IW Unidad 3: Ingeniería Web dirigida por modelosFranklin Parrales Bravo
 
IW Unidad 2: Metodologías y Técnicas de la Ingeniería Web
IW Unidad 2: Metodologías y Técnicas de la Ingeniería WebIW Unidad 2: Metodologías y Técnicas de la Ingeniería Web
IW Unidad 2: Metodologías y Técnicas de la Ingeniería WebFranklin Parrales Bravo
 
AD Unidad4: Programación paralela y distribuida
AD Unidad4: Programación paralela y distribuidaAD Unidad4: Programación paralela y distribuida
AD Unidad4: Programación paralela y distribuidaFranklin Parrales Bravo
 
AD Unidad3: Tecnologías de aplicaciones distribuidas
AD Unidad3: Tecnologías de aplicaciones distribuidasAD Unidad3: Tecnologías de aplicaciones distribuidas
AD Unidad3: Tecnologías de aplicaciones distribuidasFranklin Parrales Bravo
 
EP Unidad03: Planificación financiera y análisis de riesgos
EP Unidad03: Planificación financiera y análisis de riesgosEP Unidad03: Planificación financiera y análisis de riesgos
EP Unidad03: Planificación financiera y análisis de riesgosFranklin Parrales Bravo
 
AD Unidad2: Diseño de programas paralelos y distribuidos
AD Unidad2: Diseño de programas paralelos y distribuidosAD Unidad2: Diseño de programas paralelos y distribuidos
AD Unidad2: Diseño de programas paralelos y distribuidosFranklin Parrales Bravo
 
AD Unidad1: Fundamentos de sistemas paralelos y distribuidos
AD Unidad1: Fundamentos de sistemas paralelos y distribuidosAD Unidad1: Fundamentos de sistemas paralelos y distribuidos
AD Unidad1: Fundamentos de sistemas paralelos y distribuidosFranklin Parrales Bravo
 
EP Unidad01: Principios básicos de la metodología de proyectos
EP Unidad01: Principios básicos de la metodología de proyectosEP Unidad01: Principios básicos de la metodología de proyectos
EP Unidad01: Principios básicos de la metodología de proyectosFranklin Parrales Bravo
 
EP Unidad02: Conceptos para el alcance, tiempo y muestra
EP Unidad02: Conceptos para el alcance, tiempo y muestraEP Unidad02: Conceptos para el alcance, tiempo y muestra
EP Unidad02: Conceptos para el alcance, tiempo y muestraFranklin Parrales Bravo
 
GCSW Unidad1: Objetos de la Gestión de Configuración del Software
GCSW Unidad1: Objetos de la Gestión de Configuración del SoftwareGCSW Unidad1: Objetos de la Gestión de Configuración del Software
GCSW Unidad1: Objetos de la Gestión de Configuración del SoftwareFranklin Parrales Bravo
 
GCSW Unidad2: Actividades de la gestión de configuración del software
GCSW Unidad2: Actividades de la gestión de configuración del software GCSW Unidad2: Actividades de la gestión de configuración del software
GCSW Unidad2: Actividades de la gestión de configuración del software Franklin Parrales Bravo
 
POO Unidad 4: Persistencia de objetos y manejo de archivos
POO Unidad 4: Persistencia de objetos y manejo de archivosPOO Unidad 4: Persistencia de objetos y manejo de archivos
POO Unidad 4: Persistencia de objetos y manejo de archivosFranklin Parrales Bravo
 
POO Unidad 3: Interfaz gráfica de usuario e hilos
POO Unidad 3: Interfaz gráfica de usuario e hilosPOO Unidad 3: Interfaz gráfica de usuario e hilos
POO Unidad 3: Interfaz gráfica de usuario e hilosFranklin Parrales Bravo
 
POO Unidad 2: Programación Orientada a Objetos
POO Unidad 2: Programación Orientada a ObjetosPOO Unidad 2: Programación Orientada a Objetos
POO Unidad 2: Programación Orientada a ObjetosFranklin Parrales Bravo
 
POO Unidad 1: Introducción a la Programación Orientada a Objetos
POO Unidad 1: Introducción a la Programación Orientada a ObjetosPOO Unidad 1: Introducción a la Programación Orientada a Objetos
POO Unidad 1: Introducción a la Programación Orientada a ObjetosFranklin Parrales Bravo
 
RD Unidad 3: IPv6, Routers y Enrutamiento
RD Unidad 3: IPv6, Routers y EnrutamientoRD Unidad 3: IPv6, Routers y Enrutamiento
RD Unidad 3: IPv6, Routers y EnrutamientoFranklin Parrales Bravo
 

Más de Franklin Parrales Bravo (20)

Presentacion del congreso ETCM del 2021 en Cuenca
Presentacion del congreso ETCM del 2021 en CuencaPresentacion del congreso ETCM del 2021 en Cuenca
Presentacion del congreso ETCM del 2021 en Cuenca
 
IW Unidad 1: Introducción a la Ingeniería Web
IW Unidad 1: Introducción a la Ingeniería WebIW Unidad 1: Introducción a la Ingeniería Web
IW Unidad 1: Introducción a la Ingeniería Web
 
IW Unidad 4: Web accesible, semántica y ubicua
IW Unidad 4: Web accesible, semántica y ubicuaIW Unidad 4: Web accesible, semántica y ubicua
IW Unidad 4: Web accesible, semántica y ubicua
 
IW Unidad 3: Ingeniería Web dirigida por modelos
IW Unidad 3: Ingeniería Web dirigida por modelosIW Unidad 3: Ingeniería Web dirigida por modelos
IW Unidad 3: Ingeniería Web dirigida por modelos
 
MOD Unidad 2: Tipos de modelado
MOD Unidad 2: Tipos de modeladoMOD Unidad 2: Tipos de modelado
MOD Unidad 2: Tipos de modelado
 
IW Unidad 2: Metodologías y Técnicas de la Ingeniería Web
IW Unidad 2: Metodologías y Técnicas de la Ingeniería WebIW Unidad 2: Metodologías y Técnicas de la Ingeniería Web
IW Unidad 2: Metodologías y Técnicas de la Ingeniería Web
 
AD Unidad4: Programación paralela y distribuida
AD Unidad4: Programación paralela y distribuidaAD Unidad4: Programación paralela y distribuida
AD Unidad4: Programación paralela y distribuida
 
AD Unidad3: Tecnologías de aplicaciones distribuidas
AD Unidad3: Tecnologías de aplicaciones distribuidasAD Unidad3: Tecnologías de aplicaciones distribuidas
AD Unidad3: Tecnologías de aplicaciones distribuidas
 
EP Unidad03: Planificación financiera y análisis de riesgos
EP Unidad03: Planificación financiera y análisis de riesgosEP Unidad03: Planificación financiera y análisis de riesgos
EP Unidad03: Planificación financiera y análisis de riesgos
 
AD Unidad2: Diseño de programas paralelos y distribuidos
AD Unidad2: Diseño de programas paralelos y distribuidosAD Unidad2: Diseño de programas paralelos y distribuidos
AD Unidad2: Diseño de programas paralelos y distribuidos
 
AD Unidad1: Fundamentos de sistemas paralelos y distribuidos
AD Unidad1: Fundamentos de sistemas paralelos y distribuidosAD Unidad1: Fundamentos de sistemas paralelos y distribuidos
AD Unidad1: Fundamentos de sistemas paralelos y distribuidos
 
EP Unidad01: Principios básicos de la metodología de proyectos
EP Unidad01: Principios básicos de la metodología de proyectosEP Unidad01: Principios básicos de la metodología de proyectos
EP Unidad01: Principios básicos de la metodología de proyectos
 
EP Unidad02: Conceptos para el alcance, tiempo y muestra
EP Unidad02: Conceptos para el alcance, tiempo y muestraEP Unidad02: Conceptos para el alcance, tiempo y muestra
EP Unidad02: Conceptos para el alcance, tiempo y muestra
 
GCSW Unidad1: Objetos de la Gestión de Configuración del Software
GCSW Unidad1: Objetos de la Gestión de Configuración del SoftwareGCSW Unidad1: Objetos de la Gestión de Configuración del Software
GCSW Unidad1: Objetos de la Gestión de Configuración del Software
 
GCSW Unidad2: Actividades de la gestión de configuración del software
GCSW Unidad2: Actividades de la gestión de configuración del software GCSW Unidad2: Actividades de la gestión de configuración del software
GCSW Unidad2: Actividades de la gestión de configuración del software
 
POO Unidad 4: Persistencia de objetos y manejo de archivos
POO Unidad 4: Persistencia de objetos y manejo de archivosPOO Unidad 4: Persistencia de objetos y manejo de archivos
POO Unidad 4: Persistencia de objetos y manejo de archivos
 
POO Unidad 3: Interfaz gráfica de usuario e hilos
POO Unidad 3: Interfaz gráfica de usuario e hilosPOO Unidad 3: Interfaz gráfica de usuario e hilos
POO Unidad 3: Interfaz gráfica de usuario e hilos
 
POO Unidad 2: Programación Orientada a Objetos
POO Unidad 2: Programación Orientada a ObjetosPOO Unidad 2: Programación Orientada a Objetos
POO Unidad 2: Programación Orientada a Objetos
 
POO Unidad 1: Introducción a la Programación Orientada a Objetos
POO Unidad 1: Introducción a la Programación Orientada a ObjetosPOO Unidad 1: Introducción a la Programación Orientada a Objetos
POO Unidad 1: Introducción a la Programación Orientada a Objetos
 
RD Unidad 3: IPv6, Routers y Enrutamiento
RD Unidad 3: IPv6, Routers y EnrutamientoRD Unidad 3: IPv6, Routers y Enrutamiento
RD Unidad 3: IPv6, Routers y Enrutamiento
 

ED Unidad 3: Estructuras de datos lineales (listas)

  • 1. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 1 09/03/2022 Estructuras de datos lineales (listas) Unidad 3 Material docente compilado por el profesor Ph.D. Franklin Parrales Bravo para uso de los cursos de Estructuras de Datos
  • 2. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 2 09/03/2022 Objetivo general de la Unidad 3 Implementar estructuras de datos lineales usando objetos para agilizar el manejo de los datos en la memoria principal de los programas.
  • 3. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 3 09/03/2022 Contenido • Listas enlazadas – Conceptos generales – Representación gráfica – Estructura de lista enlazada: • Clase Lista y constructor nodo de la lista • Clasificación de listas enlazadas – Simples, dobles, circulares – Operaciones básicas: Insertar, buscar, eliminar, recorrido – Operaciones adicionales: Pilas y colas • Colecciones genéricas e Iteradores – Colección List <T> – Listas, – Stack <T> – Pilas, – Queue <T> – Colas
  • 4. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 4 09/03/2022 Contenido • Listas enlazadas – Conceptos generales – Representación gráfica – Estructura de lista enlazada: • Clase Lista y constructor nodo de la lista • Clasificación de listas enlazadas – Simples, dobles, circulares – Operaciones básicas: Insertar, buscar, eliminar, recorrido – Operaciones adicionales: Pilas y colas • Colecciones genéricas e Iteradores – Colección List <T> – Listas, – Stack <T> – Pilas, – Queue <T> – Colas
  • 5. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 5 09/03/2022 Listas: definición • Una lista es – Una colección de 0 o mas elementos • Si la lista no tiene elementos, se dice que esta vacía – En una lista, todos los elementos son de un mismo tipo • Son estructuras lineales, es decir – Sus elementos están colocados uno detrás de otro – Cada elemento de una lista se conoce con el nombre de NODO • Las listas – Son mucho más flexibles que los arreglos – Permiten trabajo “dinámico” con un grupo de elementos
  • 6. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 6 09/03/2022 Contenido • Listas enlazadas – Conceptos generales – Representación gráfica – Estructura de lista enlazada: • Clase Lista y constructor nodo de la lista • Clasificación de listas enlazadas – Simples, dobles, circulares – Operaciones básicas: Insertar, buscar, eliminar, recorrido – Operaciones adicionales: Pilas y colas • Colecciones genéricas e Iteradores – Colección List <T> – Listas, – Stack <T> – Pilas, – Queue <T> – Colas
  • 7. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 7 09/03/2022 Anatomía de una lista enlazada • Una lista vinculada consta de : – Una secuencia de nodos a b c d ▪ Cada nodo contiene un valor ▪ Y un enlace (puntero o referencia) a otro nodo ▪ El último nodo contiene un enlace a null ▪ La lista podría o no tener una cabecera (header) myList ▪ myList no es un encabezado, es solo una referencia
  • 8. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 8 09/03/2022 • Para el siguiente ejemplo, cada nodo de la lista simple es una instancia de la clase que se muestra aquí. data link 10 data link 15 data link 7 null public class IntNode { private int data; private IntNode link; ... } Nodos de una lista
  • 9. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 9 09/03/2022 data link 7 • La porción de datos de cada nodo en este ejemplo es un int. link null public class IntNode { private int data; private IntNode link; ... } data link 15 Nodos de una lista data 10
  • 10. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 10 09/03/2022 • Cada IntNode también contiene un enlace que hace referencia a otro IntNode. data 15 data 7 public class IntNode { private int data; private IntNode link; ... } Nodos de una lista data 10 link link null link
  • 11. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 11 09/03/2022 Nodos de una lista 10 5 8 2 31 25 25 Contenido Enlace C S 2 31 25 C S NODO A NODO B
  • 12. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 12 09/03/2022 Declaraciones para listas vinculadas • Una lista puede realizar un seguimiento del nodo frontal mediante el uso de una variable como head en este ejemplo • Tenga en cuenta que head no es un IntNode, sólo es una referencia a un IntNode. data link 10 data link 15 data link 7 null head
  • 13. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 13 09/03/2022 Declaraciones para listas vinculadas • Representamos la lista vacía almacenando null en la referencia al head. head null
  • 14. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 14 09/03/2022 Contenido • Listas enlazadas – Conceptos generales – Representación gráfica – Estructura de lista enlazada: • Clase Lista y constructor nodo de la lista • Clasificación de listas enlazadas – Simples, dobles, circulares – Operaciones básicas: Insertar, buscar, eliminar, recorrido – Operaciones adicionales: Pilas y colas • Colecciones genéricas e Iteradores – Colección List <T> – Listas, – Stack <T> – Pilas, – Queue <T> – Colas
  • 15. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 15 09/03/2022 Clase Lista • La clase Lista identifica una referencia (puntero) a un objeto (o null). • La declaración de la clase Lista debe incluir: – Las variables miembro. – El/los constructor/es. – [Opcional] Otros métodos que vayan a ser utilizados por objetos externos. • Código: public class Lista { NodoLista inicio; String nombre; public ListaEnlazada () { inicio = null; nombre = null; } // Otros métodos }
  • 16. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 16 09/03/2022 Clase NodoLista • La estructura de datos que representa los nodos de una lista debe contemplarse como una clase (NodoLista.java). • Se debe declarar: – Las variables miembro (clave y sig). – El/los constructor/es. – El destructor [innecesario en Java]. – [Opcional] Otros métodos que vayan a ser utilizados por objetos externos • Código: public class NodoLista { int clave; NodoLista sig; public NodoLista (int dato) { clave = dato; sig = null; } // otros métodos }
  • 17. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 17 09/03/2022 Contenido • Listas enlazadas – Conceptos generales – Representación gráfica – Estructura de lista enlazada: • Clase Lista y constructor nodo de la lista • Clasificación de listas enlazadas – Simples, dobles, circulares – Operaciones básicas: Insertar, buscar, eliminar, recorrido – Operaciones adicionales: Pilas y colas • Colecciones genéricas e Iteradores – Colección List <T> – Listas, – Stack <T> – Pilas, – Queue <T> – Colas
  • 18. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 18 09/03/2022 Tipos • De acuerdo a su implementación, las listas se clasifican en – Simples – Doblemente Enlazadas – Circulares • De acuerdo a su comportamiento, los conjuntos lineales se clasifican en – Listas – Pilas – Colas
  • 19. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 19 09/03/2022 Contenido • Listas enlazadas – Conceptos generales – Representación gráfica – Estructura de lista enlazada: • Clase Lista y constructor nodo de la lista • Clasificación de listas enlazadas – Simples, dobles, circulares – Operaciones básicas: Insertar, buscar, eliminar, recorrido – Operaciones adicionales: Pilas y colas • Colecciones genéricas e Iteradores – Colección List <T> – Listas, – Stack <T> – Pilas, – Queue <T> – Colas
  • 20. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 20 09/03/2022 Listas enlazadas simples (SLL: singly linked list) • Se define como un conjunto de nodos – Uno detrás de otro – Del cual siempre se puede conocer al nodo inicial y al final • De cada nodo de la lista, se conoce – Un contenido, que es la información que almacena dentro • Puede ser de cualquier tipo de dato – Un sucesor único • Excepto el ultimo nodo de la lista 10 5 8 2 31 25 25 2 31 25 1
  • 21. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 21 09/03/2022 Lista simple: nivel lógico • Comportamiento (a/con una lista se puede) – Crear y Eliminar – Conocer si esta vacía – Añadir elementos y removerlos – Consultar el primer y al ultimo elemento – Imprimir sus elementos en pantalla – Buscar un elemento con cierta información en la lista • Estado: <listaSimple> ::= <comienzo> + {<ref_nodo>} + <final> <comienzo> ::= <enlace> <final> ::= <enlace>
  • 22. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 22 09/03/2022 Listas doblemente enlazadas • En las listas enlazadas solo se avanza en un sentido • En las doblemente, se puede avanzar hacia la derecha o hacia la izq. 2 Cuando la lista esta vacia, header y last, son iguales a NULL I DS DA last header 10 5 8 25 2 31
  • 23. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 23 09/03/2022 Listas doblemente enlazadas • En estas listas cada nodo tiene – Un predecesor, excepto el primero – Un sucesor, excepto el ultimo • Cada nodo ya no tiene un solo enlace, tiene dos, hacia el siguiente y hacia el anterior <lde> ::= <comienzo> + {<nodo>}+<ultimo> <comienzo> :: = <enlace> <ultimo> :: = <enlace> <enlace> ::= (<<referencia_nodo>> | NULL) <nodo> ::= <predecesor>+<contenido>+<sucesor> <predecesor> ::= <enlace> <sucesor> ::= <enlace> < contenido > ::= <<dato>>{<<dato>>}
  • 24. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 24 09/03/2022 Listas circulares • El avance en las listas enlazadas es – Solo a la derecha(siguiente) – Limitado hasta el ultimo nodo • Hay ocasiones en las que se desearia, – Poder avanzar ilimitadamente – Del ultimo nodo, pasar al primero • last->siguiente = header 10 5 8 2 31 25 last->sig last 3
  • 25. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 25 09/03/2022 Contenido • Listas enlazadas – Conceptos generales – Representación gráfica – Estructura de lista enlazada: • Clase Lista y constructor nodo de la lista • Clasificación de listas enlazadas – Simples, dobles, circulares – Operaciones básicas: Insertar, buscar, eliminar, recorrido – Operaciones adicionales: Pilas y colas • Colecciones genéricas e Iteradores – Colección List <T> – Listas, – Stack <T> – Pilas, – Queue <T> – Colas
  • 26. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 26 09/03/2022 TDA Lista public interface Lista<E> { public void clear(); public void insert(E item); public void append(E item); public E remove(); public void moveToStart(); public void moveToEnd(); public void prev(); public void next(); public int length(); public int currPos(); public void moveToPos(int pos); public E getValue(); } Este es un ejemplo de TDA con el que nuestras implementaciones de lista deben coincidir. Un punto clave a tener en cuenta aquí: ¡Esto no dice nada sobre CÓMO se implementa la lista! Eso viene después, y usaremos este TDA para nuestras implementaciones.
  • 27. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 27 09/03/2022 NodoLista Class (Listas simples) Asignación dinámica de nuevos elementos de lista. class NodoLista<E> { private E element; private NodoLista<E> next; // Constructores NodoLista(E it, NodoLista<E> nextval){ element = it; next = nextval; } NodoLista(NodoLista<E> nextval) { next = nextval; } NodoLista<E> next() { return next; } NodoLista<E> setNext(NodoLista<E> nextval) { return next = nextval; } E element() { return element; } E setElement(E it) { return element = it; } } 1
  • 28. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 28 09/03/2022 Posición actual en Listas Simples (1) Enfoque básico: curr (posición actual) apunta al primer nodo en la partición derecha. Queremos insertar 10 al comienzo de la partición derecha. No hay acceso (si está disponible) al nodo con valor 23. ¿Cómo podemos hacer la inserción?
  • 29. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 29 09/03/2022 Posición actual en Listas Simples (2) Implementación alternativa: curr apunta al nodo que precede al primer nodo real en la partición derecha. Ahora podemos hacer la inserción. También tenga en cuenta el uso del nodo de encabezado. El nodo head elimina casos especiales en el código.
  • 30. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 30 09/03/2022 Clase para Lista Enlazada Simple (1) class LList<E> implements Lista<E> { private NodoLista<E> head; private NodoLista<E> tail; protected NodoLista<E> curr; int cnt; //Constructores LList(int size) { this(); } LList() { curr = tail = head = new NodoLista<E>(null); cnt = 0; } head tail
  • 31. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 31 09/03/2022 Clase para Lista Enlazada Simple (2) public void clear() { head.setNext(null); curr = tail = head = new NodoLista<E>(null); cnt = 0; } public void moveToStart() { curr = head; } public void moveToEnd() { curr = tail; } public int length() { return cnt; } public void next() { if (curr != tail) { curr = curr.next(); } } public E getValue() { assert curr.next() != null : "Nothing to get"; return curr.next().element(); } head tail
  • 32. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 32 09/03/2022 Insertar al inicio de la lista // Inserto el elemento "it" en la posición de inicio public void insert(E it) { head = new NodoLista<E>(it, head)); cnt++; // Aumento el contador } 10 5 8 2 31 25 tail head it nuevo head nuevo->sig = head; head = nuevo;
  • 33. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 33 09/03/2022 curr 31 Insertar después de la posición actual // Inserto el elemento "it" en la posición actual public void insert(E it) { curr.setNext(new NodoLista<E>(it, curr.next())); if (tail == curr) tail = curr.next(); cnt++; // Aumento el contador } 10 5 23 2 31 12 head tail curr it tail it tail
  • 34. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 34 09/03/2022 Insertar al final de la lista: Append public void append(E it) { tail = tail.setNext(new NodoLista<E>(it, null)); cnt++; } 31 tail it tail
  • 35. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 35 09/03/2022 Buscar /** @return True if k is in list L, false otherwise */ public static Boolean find(Lista<Integer> L, int k) { for (L.moveToStart(); L.currPos()<L.length(); L.next()) if (k == L.getValue()) return true; return false; // k not found } 10 5 8 2 31 25 tail head Busco 25 p p p p p Busco 30 p p p p p p
  • 36. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 36 09/03/2022 Eliminar nodo inicial y devolver el elemento borrado /** Eliminar y devolver el elemento borrado*/ public E removeHead() { if (head == null){ return null; }else{ E it = head.element(); head = head.next(); cnt--; return it; } } 10 5 8 2 31 25 head it = head. element(); head head = head->sig; tail
  • 37. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 37 09/03/2022 Eliminar nodo no inicial y devolver el elemento borrado /** Eliminar y devolver el elemento borrado*/ public E remove() { if (curr.next() == null) return null; E it = curr.next().element(); if (tail == curr.next()) tail = curr; curr.setNext(curr.next().next()); cnt--; return it; } 10 5 it 2 31 25 head tail curr.next() curr
  • 38. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 38 09/03/2022 Recorrido para mover curr al nodo previo /** Move curr one step left; no change if already at front */ public void prev() { if (curr == head) return; // Si el nodo actual es el head, retorno dado que no tiene nodo previo NodoLista<E> temp = head; // Inicio el recorrido desde el nodo head // Recorro la lista hacia adelante hasta encontrar el elemento anterior al nodo actual (curr) while (p.next() != curr) p = p.next(); curr = p; } 10 5 8 2 31 25 tail head p curr p p p curr
  • 39. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 39 09/03/2022 Recorriendo una lista enlazada simple (1) head = SLList<String> next = data = "Tom" Node<String> next = data = "Dick" Node<String> next = data = "Ann" null Node<String> nodeRef Hacer algo con nodeRef Hacer algo con nodeRef Hacer algo con nodeRef
  • 40. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 40 09/03/2022 Recorriendo una lista enlazada simple (2) toString() se puede implementar con un recorrido: public String toString() { Node<String> nodeRef = head; StringBuilder result = new StringBuilder(); while (nodeRef != null) { result.append(nodeRef.data); if (nodeRef.next != null) { result.append(" ==> "); } nodeRef = nodeRef.next; } return result.toString(); }
  • 41. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 41 09/03/2022 Get/Set curr Position /** Return position of the current element */ public int currPos() { NodoLista<E> temp = head; int i; for (i=0; curr != temp; i++) temp = temp.next(); return i; } /** Move down list to "pos" position */ public void moveToPos(int pos) { assert (pos>=0) && (pos<=cnt) : "Position out of range"; curr = head; for(int i=0; i<pos; i++) curr = curr.next(); }
  • 42. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 42 09/03/2022 Extensiones a la Lista Enlazada Simple static NodoLista freelist = null; static <E> NodoLista<E> get(E it, NodoLista<E> nextval) { if (freelist == null) return new NodoLista<E>(it, nextval); NodoLista<E> temp = freelist; freelist = freelist.next(); temp.setElement(it); temp.setNext(nextval); return temp; } void release() { // Return to freelist element = null; next = freelist; freelist = this; }
  • 43. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 43 09/03/2022 Usando Freelist public void insert(E it) { curr.setNext(NodoLista.get(it, curr.next())); if (tail == curr) tail = curr.next(); cnt++; } public E remove() { if (curr.next() == null) return null; E it = curr.next().element(); if (tail == curr.next()) tail = curr; NodoLista<E> tempptr = curr.next(); curr.setNext(curr.next().next()); tempptr.release(); cnt--; return it; }
  • 44. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 44 09/03/2022 Listas doblemente enlazadas 2
  • 45. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 45 09/03/2022 Nodos en Listas doblemente enlazadas class DNodo<E> { private E element; private DNodo<E> next; private DNodo<E> prev; DNodo(E it, DNodo<E> p, DNodo<E> n) { element = it; prev = p; next = n; } DNodo(DNodo<E> p, DNodo<E> n) { prev = p; next = n; } DNodo<E> next() { return next; } DNodo<E> setNext(DNodo<E> nextval) { return next = nextval; } DNodo<E> prev() { return prev; } DNodo<E> setPrev(DNodo<E> prevval) { return prev = prevval; } E element() { return element; } E setElement(E it) { return element = it; } }
  • 46. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 46 09/03/2022 Insertar nodo en Listas doblemente enlazadas public void insert(E it) { curr.setNext(new DNodo<E>(it, curr, curr.next())); curr.next().next().setPrev(curr.next()); cnt++; } head tail 10 5 21 12 17 6 curr nuevo it
  • 47. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 47 09/03/2022 Eliminar nodo en Listas doblemente enlazadas public E remove() { if (curr.next() == tail) return null; E it = curr.next().element(); curr.next().next().setPrev(curr); curr.setNext(curr.next().next()); cnt--; return it; } 10 5 21 12 17 6 head tail curr
  • 48. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 48 09/03/2022 Listas circulares public class ListaCircular { private Nodo lc; public ListaCircular() { lc = null; } //... 3 10 5 8 2 31 25 last->sig last
  • 49. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 49 09/03/2022 Insertar nodo en Listas circulares public ListaCircular insertar(Elemento entrada) { Nodo nuevo; nuevo = new Nodo(entrada); if (lc != null) // lista circular no vacía { nuevo.enlace = lc.enlace; lc.enlace = nuevo; } lc = nuevo; return this; }
  • 50. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 50 09/03/2022 Eliminar nodo en una lista circular El algoritmo para eliminar un nodo de una lista circular es: 1. Búsqueda del nodo que contiene el dato. 2. Se enlaza el nodo anterior con el siguiente. 3. En caso de que el nodo a eliminar sea por el que se accede a la lista, lc, se modifica lc para que tenga la dirección del nodo anterior. 4. Por último, el sistema libera la memoria ocupada por el nodo al anular la referencia
  • 51. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 51 09/03/2022 public void eliminar(Elemento entrada){ Nodo actual; boolean encontrado = false; //bucle de búsqueda actual = lc; while ((actual.enlace != lc) && (!encontrado)){ encontrado = (actual.enlace.dato == entrada); if (!encontrado){ actual = actual.enlace; } } encontrado = (actual.enlace.dato == entrada); // Enlace de nodo anterior con el siguiente if (encontrado){ Nodo p; p = actual.enlace; // Nodo a eliminar if (lc == lc.enlace) // Lista con un solo nodo lc = null; else{ if (p == lc){ lc = actual; // Se borra el elemento referenciado por lc, // el nuevo acceso a la lista es el anterior } actual.enlace = p.enlace; } p = null; } }
  • 52. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 52 09/03/2022 Recorrer una lista circular public void recorrer(){ Nodo p; if (lc != null){ p = lc.enlace; // siguiente nodo al de acceso do { System.out.println("t" + p.dato); p = p.enlace; }while (p != lc.enlace); }else System.out.println("t Lista Circular vacía."); }
  • 53. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 53 09/03/2022 Contenido • Listas enlazadas – Conceptos generales – Representación gráfica – Estructura de lista enlazada: • Clase Lista y constructor nodo de la lista • Clasificación de listas enlazadas – Simples, dobles, circulares – Operaciones básicas: Insertar, buscar, eliminar, recorrido – Operaciones adicionales: Pilas y colas • Colecciones genéricas e Iteradores – Colección List <T> – Listas, – Stack <T> – Pilas, – Queue <T> – Colas
  • 54. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 54 09/03/2022 Pila (Stack): un TDA simple  Uno de los conceptos mas utiles en computacion es la pila o stack  Es un conjunto de elementos, en la que:  Los elementos se añaden y se remueven por un solo extremo  Este extremo es llamado “tope” de la pila La ultima en llegar, sera la primera en salir: LAST IN, FIRST OUT LIFO  Ejemplo:  Cuando un empleado se va de vacaciones, le llega correo a su escritorio.  Las cartas se van “apilando”.  Al regresar de vacaciones, la ultima carga en llegar, sera la primera que revisara  Al terminar de revisarla, la nueva carta del tope de la pila habra cambiado  Del “pilo” de cartas, la mas nueva que queda, sera la siguiente en ser revisada 1
  • 55. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 55 09/03/2022 TDA Pila: Definición • Dada una Pila llamada S – ¿Qué datos serian importantes conocer sobre la Pila? – ¿Y que operaciones podriamos efectuar a la misma? Push(s,elemento1) Elemento 1 Tope o Cima Push(s,elemento2) Elemento 2 Push(S,elemento3) Elemento 3 Pop(S) EstaVacia? No Si  Al revisar c/carta, se la “sacaba” de la pila  elemento = pop(s)  La operación pop remueve el elemento Tope de la pila y lo retorna. La pila disminuye su tamaño  Usemos el ejemplo del correo:  Al acumularse,  Cada carta(elemento), era “metida” a la pila: push(s,elemento)  La operación push aumenta un elemento a la pila, y esta aumenta en su tamaño
  • 56. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 56 09/03/2022 Implementación de pilas mediante listas enlazadas simples • Dado que toda la acción ocurre en la parte superior de una pila, una lista enlazada individualmente (SLL) es una buena manera de implementarla. • El encabezado de la lista apunta a la parte superior de la pila. • Push es insertar un elemento al principio de la lista • Pop es eliminar un elemento del principio de la lista. 44 97 23 17 myStack:
  • 57. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 57 09/03/2022 Pila: operaciones EliminarPila(Pila) Efecto: recibe una pila y la libera completamente EstaVacia(Pila) retorna -> Boolean Efecto: Devuelve true si esta vacia y false en caso contrario Push(pila, elemento) Efecto: Toma la pila y aumenta su tamaño, poniendo el elemento en la cima de la pila Pop(Pila) retorna -> elemento Efecto: Recibe la pila, remueve el elemento tope y lo retorna Excepcion: Si la pila esta vacia, produce error TopePila(Pila) retorna -> elemento Efecto: Devuelve el elemento cima de la pila Excepcion: Si la pila esta vacia produce error InicializarPila(Pila) Efecto: recibe una pila y la inicializa para su trabajo normal
  • 58. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 58 09/03/2022 TDA pila: definición formal • En conclusion: – La pila es un conjunto de elementos – De los cuales solo conozco y puedo ver el TOPE • Cada elemento en la pila – Puede contener informacion de cualquier tipo, es decir, es generico <pila> ::= <tope> + {<nodo>} <tope> ::= <enlace> <enlace> ::= (<<ReferenciaNodo>> | NULL) <nodo> ::= <contenido> + <enlace> <contenido> ::= <<dato>>{<<dato>>}
  • 59. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 59 09/03/2022 Otras operaciones • Al remover el ultimo elemento de una pila esta queda vacia – Una vez vacia, no se pueden “sacar” mas elementos de la pila • Antes de sacar un elemento de la pila – Debemos saber si la pila Esta Vacia?: EstaVacia(s) • El tope de la pila siempre esta cambiando – Deberiamos poder “revisar” el elemento tope de la pila: TopePila(s) – Si la pila esta vacia, no debe existir un valor tope • El tratar de remover elementos o acceder a elementos de una pila vacia se llama – SUBDESBORDAMIENTO de la pila
  • 60. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 60 09/03/2022 Un aplicación mas práctica • El compilador siempre sabe cuando se ha escrito un paréntesis, o una llave de mas – ¿Como lo hace? • Con el uso de pilas, expresiones escritas: – (a+b)) Mal – ((a+b) * c / 4*g-h) OK • Se puede reconocer los paréntesis que no coinciden – ¿Como lograr esta aplicación de la pila?
  • 61. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 61 09/03/2022 Análisis del problema • Cuando los paréntesis coinciden: – Al final de la expresión • Total paréntesis izq = Total parentesis der – En todo momento, en cualquier punto de la expresión • Cada paréntesis der. esta precedido de uno izq • Acum. paréntesis der. siempre es <= que Acum. Paréntesis izq • Por ejemplo: 7 - ((X* ((X+Y)/(J-3)) + Y) / (4-2.5)) (A+B)) + 3 Al final de la expresion: Total ( = 1 Total ) = 2 En este punto de la expresion, ya se sabe que es incorrecta Acum ( = 1 Acum ) = 2 No se cumple la regla
  • 62. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 62 09/03/2022 Un enfoque natural  Cuando revisamos una expresión de este tipo:  Revisamos los paréntesis de la derecha, y buscamos sin tienen “match” en la izquierda  Para seguir este enfoque podríamos:  “Recordar” los paréntesis de la izquierda ( a medida que aparecen:  El primero en aparecer, será el ultimo en ser “recordado”  El ultimo en aparecer, será el primero en ser “recordado” La Pila se utiliza justamente para “recordar” de la forma abajo indicada Pop el parentesis ) encontrado 7 - ((X* ((X+Y)/(J-3)) + Y) / (4-2.5))  Asi, cuando aparece un )  El primer ( recordado, debe ser su “match”  En ese momento, este primero recordado, ya puede ser “olvidado”  Al llegar al final de la expresion, ningun ( deberia ser “recordado”
  • 63. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 63 09/03/2022 APLICANDO PILAS  Veamos, revisemos justo la expresión anterior Todos los ), encontraron su ( 7 - ( ( X *( ( X+Y) / ( J- 3) ) +Y) / ( 4- 2) ) ( ( ( (
  • 64. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 64 09/03/2022 Y ahora, el algoritmo Pila S; /*Se declara una pila s, para almacenar los ( */ Pila_Inicializar(&S); while(no hayamos leido toda la cadena) { //tomar el siguiente simbolo de la expresion if(simbolo = ‘(‘) /*Almacenarlo*/ Pila_Push(&S,simbolo); if(simbolo = ‘)’){ /*Buscar match*/ if(Pila_EstaVacia(S)) { /*No hubo match!!*/ return(FALSE) Pila_Pop(&s); } } if(Pila_EstaVacia(s)) /*Algun simbolo se quedo dentro, porque no hubo match*/ return TRUE; Else return FALSE;
  • 65. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 65 09/03/2022 TDA Cola (Queue)  Abunda este concepto, en la vida cotidiana  Cuando vamos al cine, para comprar las entradas  Cuando estamos en el supermercado, en el banco, etc.  Como funciona  Se puede decir que la cola tiene 2 extremos  FRENTE, Y FINAL  La computadora las utiliza:  Para manejar la impresión de documentos, tiempo compartido, etc. Queue -> Cola Cada documento que se manda a imprimir es “encolado”, uno a uno es enviado a la impresora Frente Final Final Frente  Todo el que llega se ubica al final de la cola  Todo el que sale, lo hace por el frente de la cola  La cola es por turno  El primero en llegar, tiene la seguridad de que sera el primero en salir:  FIRST IN FIRST OUT -> FIFO 2
  • 66. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 66 09/03/2022 Queues en un sistema informático • Cuando un proceso (programa) requiere un determinado recurso – Impresora – acceso al disco en una red – caracteres en un keyboard buffer • Operaciones de manipulación de colas – isEmpty(): retorna true o false – first(): retorna la copia del valor de la cabeza – add(v): agrega un nuevo valor al final de la cola – remove(): elimina, retorna valor de la cabeza
  • 67. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 67 09/03/2022 Operaciones básicas • Al suponer que existe un TDA Cola, podemos: – Cola Q; • Todo TDA presenta operaciones básicas, en este caso: – EnColar • Insertar un elemento nuevo a la cola, al final de la misma, • El final aumenta – DesEnColar • Cuando un elemento es removido de la cola • Remueve el elemento del frente • Retorna el elemento removido • No se puede ejecutar si la cola EstaVacia • Asi como en la pila – Cualquier intento de acceder a elementos en una Cola Vacía: • SUBDESBORDAMIENTO DE LA COLA
  • 68. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 68 09/03/2022 Implementación de colas con listas enlazadas simples (SLL) • In an SLL you can easily find the successor of a node, but not its predecessor – Remember, pointers (references) are one-way • If you know where the last node in a list is, it’s hard to remove that node, but it’s easy to add a node after it • Hence, – Use the first element in an SLL as the front of the queue – Use the last element in an SLL as the rear of the queue – Keep pointers to both the front and the rear of the SLL
  • 69. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 69 09/03/2022 Estructura Queue myHead mySize myTail n aQueue . . . . . . value0 value1 valuen-1
  • 70. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 70 09/03/2022 Encolando un nodo Para encolar (add) un nodo: Encuentra el actual último nodo Cámbielo para que apunte al nuevo último nodo Cambiar el último puntero en el encabezado de la lista 17 Nodo a ser encolado 23 44 last first 97
  • 71. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 71 09/03/2022 Desencolando un nodo • Para desencolar (remove) un nodo: – Copiar el puntero del primer nodo en el encabezado 44 97 23 17 last first
  • 72. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 72 09/03/2022 Métodos de clase Queue • Constructor – set myHead, myTail to null – set mySize to zero • isEmpty() – return results of comparison mySize == 0 • front() – return myHead.getValue() // unless empty
  • 73. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 73 09/03/2022 Métodos de clase Queue • add() – create new node, update attribute variables – if queue is empty, must also update myHead • remove() – must check if class not empty otherwise … – save handle to first object – adjust head to refer to node – update mySize
  • 74. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 74 09/03/2022 Deques • Un deque es un double-ended queue • Las inserciones y eliminaciones pueden ocurrir en cualquier extremo • La implementación es similar a la de las colas • Los deques no se utilizan mucho • Deberías saber qué es un deque, pero no los exploraremos mucho más.
  • 75. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 75 09/03/2022 Contenido • Listas enlazadas – Conceptos generales – Representación gráfica – Estructura de lista enlazada: Clase Lista y constructor nodo de la lista • Clasificación de listas enlazadas – Simples, dobles, circulares – Operaciones básicas: Insertar, buscar, eliminar, recorrido – Operaciones adicionales: Pilas y colas • Colecciones genéricas e Iteradores – Colección List <T> – Listas, – Stack <T> – Pilas, – Queue <T> – Colas
  • 76. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 76 09/03/2022 La interfaz Collection • Excluye – add(int, E) – get(int) – remove(int) – set(int, E) • Pero incluye – add(E) – remove(Object) – El método iterator
  • 77. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 77 09/03/2022 The Collection Framework <<interface>> Iterable< <<interface>> Collection <<interface>> Queue< <<interface>> List< AbstractCollection <<interface>> Set <<interface>> Deque AbstractList AbstractSet <<interface>> SortedSet AbstractSequential List Vector ArrayList HashSet <<interface>> NavigableSet< TreeSet ConcurrentSkipListSet LinkedList Stack LinkedHashSe t
  • 78. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 78 09/03/2022 Características comunes de las colecciones • crecen según sea necesario • tienen referencias a objetos • al menos dos constructores – uno para crear una colección vacía – uno para hacer una copia de otra colección
  • 79. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 79 09/03/2022 Características comunes de las colecciones general Collection  el orden de los elementos no está especificado Colecciones que implementan la interfaz List  el orden de los elementos está determinado por el índice
  • 80. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 80 09/03/2022 Características comunes de las colecciones  Para una Collection general  la posición donde se inserta un objeto no es especificada  Pero para ArrayList y LinkedList  add(E) siempre inserta al final y siempre retorna true
  • 81. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 81 09/03/2022 Contenido • Listas enlazadas – Conceptos generales – Representación gráfica – Estructura de lista enlazada: Clase Lista y constructor nodo de la lista • Clasificación de listas enlazadas – Simples, dobles, circulares – Operaciones básicas: Insertar, buscar, eliminar, recorrido – Operaciones adicionales: Pilas y colas • Colecciones genéricas e Iteradores – Colección List <T> – Listas, – Stack <T> – Pilas, – Queue <T> – Colas
  • 82. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 82 09/03/2022 Interfaz java.util.List y sus implementaciones
  • 83. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 83 09/03/2022 La clase LinkedList • Dado LinkedList alist = new LinkedList(); . . . aList.add(new(integer(88)); aList.add(new(integer(77)); aList.add(new(integer(66)); Objeto resultante mostrado a la izquierda aList head size tail 3 66 88 77 https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html
  • 84. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 84 09/03/2022 Recordando: Variaciones en listas enlazadas • Las listas se pueden enlazar doblemente como se muestra en la figura anterior • Las listas también se pueden enlazar en una sola dirección – El atributo podría no necesitar un enlace a la cola – El nodo necesita un enlace hacia adelante y un puntero solo a los datos. – El último elemento de la lista tiene un enlace establecido en nulo • Las listas se pueden enlazar circularmente – El último nodo tiene un enlace al primer nodo
  • 85. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 85 09/03/2022 Usando la clase LinkedList • Dado LinkedList addressSequence = new LinkedList(); • Use el constructor de una LinkedList para construir una lista vacía head size tail 0 addressSequence
  • 86. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 86 09/03/2022 Agregar nodos a la lista vinculada • Resultados del comando para la primera adición de nodos a la lista addressSequence.add(anAddressCounter); head size tail 0 addressSequence 123.111.345.444, 1 Sucesivas adiciones… •Crean más nodos y valores de datos •Ajustan enlaces
  • 87. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 87 09/03/2022 Acceder a valores en una LinkedList • Debe usarse el método .get ((AddressCounter)addresssSequence.get(index)).incrementCount(); • Una LinkedList no tiene una matriz con un índice para acceder a un elemento • El método get debe … – Iniciar en el nodo head cabecera – iterar a través de los nodos index para encontrar coincidencias – devolver la referencia del objeto en ese nodo • La sentencia luego hace cast y incrementCount()
  • 88. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 88 09/03/2022 Acceder a valores en una LinkedList • Para imprimir valores sucesivos para la salida for (int i = 0; i < addressSequence.size(); i++) System.out.println(addressSequence.get(i)); size method determina el límite del contador del ciclo for get(i) inicia en el primer nodo, itera i veces para alcanzar el nodo deseado •Note que cada get(i) debe pasar sobre los mismos primeros i-1 nodos previamente accesados -> O(n2) •¡Esto es ineficiente!
  • 89. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 89 09/03/2022 Acceder a valores en una LinkedList • Alternativa: algoritmo con acceso más eficiente ListIterator it = addressSequence.listIterator(); while (it.hasNext()) System.out.println( it.next()); • ListIterator es un objeto que itera a través de los valores en una lista • El método next() hace lo siguiente: 1. guarda el identificador en el objeto del nodo actual 2. avanza el iterador al siguiente nodo usando el atributo sucesor 3. devuelve el identificador guardado en el paso 1, por lo que el objeto al que se apunta se puede generar
  • 90. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 90 09/03/2022 El Iterador (Iterator) • Un iterador se puede ver como un marcador de lugar en movimiento que realiza un seguimiento de la posición actual en una lista enlazada en particular. • Un objeto iterador para una lista comienza en el primer nodo • El programador puede mover el iterador llamando a su método next() • El iterador permanece en su elemento de lista actual hasta que es necesitado • Un iterador recorre la lista en O(n) mientras que un recorrido de lista que usa llamadas get() en una lista vinculada es O(n2)
  • 91. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 91 09/03/2022 Insertar nodos en cualquier lugar de una lista enlazada • Recordar problema con ArrayList – se puede agregar solo al final de la lista – LinkedList tiene capacidad para insertar nodos en cualquier lugar • Nosotros podemos decir addressSequence.add(n, new AddressCounter()); lo cual hará… – construir un nuevo nodo – actualizar enlaces a head y tail si es necesario – actualizar los enlaces del controlador de nodo para colocar el nuevo nodo en el n-ésimo elemento de la lista – asignar memoria para el elemento de datos
  • 92. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 92 09/03/2022 La clase LinkedList
  • 93. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 93 09/03/2022 Interface Iterator • La interface Iterator está definida en java.util • La interface List a el método iterator, el cual retorna un objeto Iterator que itera sobre los elementos de esa lista
  • 94. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 94 09/03/2022 Eliminación de elementos usando Iterator (1) • Puedes usar el método remove() para eliminar elementos de una lista a medida que accede a ellos • remove() elimina el elemento más reciente retornado (devuelto) • Debe llamar a next() antes de cada remove(); de lo contrario, se lanzará una IllegalStateException • Para eliminar todos los elementos de una lista de tipo Integer que son divisibles por un valor particular…
  • 95. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 95 09/03/2022 Eliminación de elementos usando Iterator (2) public static void removeDivisibleBy(LinkedList<Integer> aList, int div) { Iterator<Integer> iter = aList.iterator(); while (iter.hasNext()) { int nextInt = iter.next(); if (nextInt % div == 0) { iter.remove(); } } }
  • 96. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 96 09/03/2022 Interface ListIterator (1) • Iterator limitations – Traverses List only in the forward direction – Provides a remove method, but no add method – You must advance the Iterator using your own loop if you do not start from the beginning of the list • ListIterator extends Iterator, overcoming these limitations
  • 97. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 97 09/03/2022 Interface ListIterator (2) • Limitaciones del Iterator – Se recorre la lista solo en dirección hacia adelante – Proporciona un método remove, pero no un método add. – Debe avanzar el Iterator usando su propio bucle si no comienza desde el principio de la lista • ListIterator extiende Iterator, superando estas limitaciones
  • 98. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 98 09/03/2022 Interface ListIterator (3) • Al igual que con Iterator, ListIterator se posiciona conceptualmente entre los elementos de la lista • Las posiciones ListIterator van de 0 a size
  • 99. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 99 09/03/2022 Interface ListIterator (4)
  • 100. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 100 09/03/2022 Interface ListIterator (5)
  • 101. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 101 09/03/2022 Comparación entre Iterator y ListIterator • ListIterator es una subinterface de Iterator – Las clases que implementen ListIterator deben proporcionar las características de ambos • Iterator: – Requiere menos métodos – Puede iterar sobre estructuras de datos más generales • Iterator es requerido por la interfaz Collection – ListIterator es requerido solo por la interfaz List
  • 102. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 102 09/03/2022 Conversión entre ListIterator y un Index (1) • ListIterator: – nextIndex()retorna el index del item a ser retornado por next() – previousIndex() retorna el index del item a ser retornado por previous() • LinkedList dispone del método listIterator(int index) – Retorna un ListIterator posicionado de manera que next()retornará el item de la posición index
  • 103. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 103 09/03/2022 Conversión entre ListIterator y un Index (2) • El método listIterator (int index) crea un nuevo ListIterator que empieza en el inicio, y recorre la lista hasta la posición deseada – generalmente se trata de una operación O(n)
  • 104. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 104 09/03/2022 Mejora en declaración for(1) • Java 5.0 introduce una mejora para la declaración for • La mejora en la declaración for crea un objeto Iterator e implícitamente llama a los métodos hasNext y next • Otros métodos Iterator, como remove, no están disponibles • El Código siguiente contabiliza el número de veces que target aparece en myList (type LinkedList<String>) count = 0; for (String nextStr : myList) { if (target.equals(nextStr)) { count++; } }
  • 105. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 105 09/03/2022 Mejora en declaración for(2) • En la lista myList de tipo type LinkedList<Integer>, cada objeto Integer es automaticamente desempaquetado: sum = 0; for (int nextInt : myList) { sum += nextInt; }
  • 106. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 106 09/03/2022 Mejora en declaración for(3) • La instrucción for mejorada también se puede usar con matrices, en este caso, chars o type char[] for (char nextCh : chars) { System.out.println(nextCh); }
  • 107. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 107 09/03/2022 Interface Iterable Each class that implements the List interface must provide an iterator method The Collection interface extends the Iterable interface All classes that implement the List interface (a subinterface of Collection) must provide an iterator method Allows use of the Java 5.0 for-each loop public interface Iterable<E> { /** returns an iterator over the elements in this collection. */ Iterator<E> iterator(); }
  • 108. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 108 09/03/2022 Ejemplo de uso LinkedList import java.util.*; public class LinkedList1{ public static void main(String args[]){ LinkedList<String> al=new LinkedList<String>(); al.add("Ravi"); al.add("Vijay"); al.add("Ravi"); al.add("Ajay"); Iterator<String> itr=al.iterator(); while(itr.hasNext()){ System.out.println(itr.next()); } } }
  • 109. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 109 09/03/2022 Ejemplo LinkedList para agregar elementos import java.util.*; public class LinkedList2{ public static void main(String args[]){ LinkedList<String> ll=new LinkedList<String>(); System.out.println("Initial list of elements: "+ll); ll.add("Ravi"); ll.add("Vijay"); ll.add("Ajay"); System.out.println("After invoking add(E e) method: "+ll); //Adding an element at the specific position ll.add(1, "Gaurav"); System.out.println("After invoking add(int index, E element) method: "+ll); LinkedList<String> ll2=new LinkedList<String>(); ll2.add("Sonoo"); ll2.add("Hanumat"); //Adding second list elements to the first list ll.addAll(ll2); System.out.println("After invoking addAll(Collection<? extends E> c) method: "+ll); LinkedList<String> ll3=new LinkedList<String>(); ll3.add("John"); ll3.add("Rahul"); //Adding second list elements to the first list at specific position ll.addAll(1, ll3); System.out.println("After invoking addAll(int index, Collection<? extends E> c) method: "+ll); //Adding an element at the first position ll.addFirst("Lokesh"); System.out.println("After invoking addFirst(E e) method: "+ll); //Adding an element at the last position ll.addLast("Harsh"); System.out.println("After invoking addLast(E e) method: "+ll); } }
  • 110. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 110 09/03/2022 Ejemplo LinkedList para remover elementos import java.util.*; public class LinkedList3 { public static void main(String [] args) { LinkedList<String> ll=new LinkedList<String>(); ll.add("Ravi"); ll.add("Vijay"); ll.add("Ajay"); ll.add("Anuj"); ll.add("Gaurav"); ll.add("Harsh"); ll.add("Virat"); ll.add("Gaurav"); ll.add("Harsh"); ll.add("Amit"); System.out.println("Initial list of elements: "+ll); //Removing specific element from arraylist ll.remove("Vijay"); System.out.println("After invoking remove(object) method: "+ll); //Removing element on the basis of specific position ll.remove(0); System.out.println("After invoking remove(index) method: "+ll); LinkedList<String> ll2=new LinkedList<String>(); ll2.add("Ravi"); ll2.add("Hanumat"); // Adding new elements to arraylist ll.addAll(ll2); System.out.println("Updated list : "+ll); //Removing all the new elements from arraylist ll.removeAll(ll2); System.out.println("After invoking removeAll() method: "+ll); //Removing first element from the list ll.removeFirst(); System.out.println("After invoking removeFirst() method: "+ll); //Removing first element from the list ll.removeLast(); System.out.println("After invoking removeLast() method: "+ll); //Removing first occurrence of element from the list ll.removeFirstOccurrence("Gaurav"); System.out.println("After invoking removeFirstOccurrence() method: "+ll); //Removing last occurrence of element from the list ll.removeLastOccurrence("Harsh"); System.out.println("After invoking removeLastOccurrence() method: "+ll); //Removing all the elements available in the list ll.clear(); System.out.println("After invoking clear() method: "+ll); } }
  • 111. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 111 09/03/2022 Ejemplo LinkedList para invertir una lista de elementos import java.util.*; public class LinkedList4{ public static void main(String args[]){ LinkedList<String> ll=new LinkedList<String>(); ll.add("Ravi"); ll.add("Vijay"); ll.add("Ajay"); //Traversing the list of elements in reverse order Iterator i=ll.descendingIterator(); while(i.hasNext()) { System.out.println(i.next()); } } }
  • 112. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 112 09/03/2022 Ejemplo de Java LinkedList: Libro import java.util.*; class Book { int id; String name,author,publisher; int quantity; public Book(int id, String name, String author, Strin g publisher, int quantity) { this.id = id; this.name = name; this.author = author; this.publisher = publisher; this.quantity = quantity; } } } public class LinkedListExample { public static void main(String[] args) { //Creating list of Books List<Book> list=new LinkedList<Book>(); //Creating Books Book b1=new Book(101,"Let us C","Yashwant Kanetkar","BPB",8); Book b2=new Book(102,"Data Communications & Networking", "Forouzan","Mc Graw Hill",4); Book b3=new Book(103,"Operating System","Galvin","Wiley",6); //Adding Books to list list.add(b1); list.add(b2); list.add(b3); //Traversing list for(Book b:list){ System.out.println(b.id+" "+b.name+" "+b.author+" "+b.publisher+" "+b.quantity); } }
  • 113. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 113 09/03/2022 Contenido • Listas enlazadas – Conceptos generales – Representación gráfica – Estructura de lista enlazada: Clase Lista y constructor nodo de la lista • Clasificación de listas enlazadas – Simples, dobles, circulares – Operaciones básicas: Insertar, buscar, eliminar, recorrido – Operaciones adicionales: Pilas y colas • Colecciones genéricas e Iteradores – Colección List <T> – Listas, – Stack <T> – Pilas, – Queue <T> – Colas
  • 114. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 114 09/03/2022 Clase Stack de Java • Java tiene una clase Stack que extiende la clase Vector • El autor señala que la implementación como una subclase de Vector proporciona herencia de métodos inapropiados para una pila (Stack) – esto viola la regla de oro para el uso de la extensión – Vector contiene mensajes no apropiados que no deben usarse en Stack
  • 115. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 115 09/03/2022 java.util.Stack • El TDA Stack, como se indica en java.util.Stack: – Stack(): método constructor – boolean empty() (pero tambien hereda isEmpty()) – Object push(Object item) – Object peek(): devuelve el elemento que esta en la cima de la pila – Object pop() – int search(Object o): Devuelve la 1-based posición del objeto en la pila • 1-based, inclusive start, inclusive end – Describing entire sequence : start = 1, end = 8 Ej:[1,2,3,4,5,6,7,8] • 0-based, inclusive start, exclusive end – Describing entire sequence: start = 0, end = 8 Ej: [0,1,2,3,4,5,6,7]
  • 116. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 116 09/03/2022 Ejemplo de uso //Pilas: Comandos basicos (push, pop, peek, empty) package pilas; import java.util.Stack; public class Pilas { public static void main(String[] args) { Stack < String > pila = new Stack < String > (); //apila 3 elementos pila.push("elemento1"); pila.push("elemento2"); pila.push("elemento3"); System.out.println("1- push: " + pila); //retira elemento que esta en la cima de la pila pila.pop(); System.out.println("2- pop: " + pila); //devuelve el elemento que esta en la cima de la pila String x = pila.peek(); System.out.println("3- peek: " + x); //devuelve cierto si la pila esta vacia boolean y = pila.empty(); System.out.println("4- empty: " + y); } } run: 1- push: [elemento1, elemento2, elemento3] 2- pop: [elemento1, elemento2] 3- peek: elemento2 4- empty: false BUILD SUCCESSFUL (total time: 0 seconds)
  • 117. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 117 09/03/2022 Contenido • Listas enlazadas – Conceptos generales – Representación gráfica – Estructura de lista enlazada: Clase Lista y constructor nodo de la lista • Clasificación de listas enlazadas – Simples, dobles, circulares – Operaciones básicas: Insertar, buscar, eliminar, recorrido – Operaciones adicionales: Pilas y colas • Colecciones genéricas e Iteradores – Colección List <T> – Listas, – Stack <T> – Pilas, – Queue <T> – Colas
  • 118. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 118 09/03/2022 java.util Interface Queue<E> • Java provides a queue interface and several implementations • boolean add(E e) – Inserts the specified element into this queue if it is possible to do so immediately without violating capacity restrictions, returning true upon success and throwing an IllegalStateException if no space is currently available. • E element() – Retrieves, but does not remove, the head of this queue. • boolean offer(E e) – Inserts the specified element into this queue if it is possible to do so immediately without violating capacity restrictions. • E peek() – Retrieves, but does not remove, the head of this queue, or returns null if this queue is empty. • E poll() – Retrieves and removes the head of this queue, or returns null if this queue is empty. • E remove() – Retrieves and removes the head of this queue.
  • 119. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 119 09/03/2022 Java Queue Implementations (1) • Dado que Queue es una interfaz, debe crear una instancia de una implementación concreta de la interfaz para poder usarla. Puede elegir entre las siguientes implementaciones de cola en la API de colecciones de Java: – java.util.LinkedList – java.util.PriorityQueue • LinkedList es una implementación de cola bastante estándar. – Los elementos de la cola se almacenan internamente en una estructura de datos de lista vinculada estándar. – Esto hace que sea más rápido insertar elementos al final (cola) de la lista y eliminar elementos del principio (encabezado) de la lista. • PriorityQueue almacena sus elementos internamente de acuerdo con su orden natural (si implementan Comparable), o de acuerdo con un Comparator pasado a PriorityQueue.
  • 120. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 120 09/03/2022 Java Queue Implementations (2) • A continuación, se muestran algunos ejemplos de cómo crear una instancia de cola: • En la mayoría de las implementaciones de cola, el principio y el final de la cola se encuentran en extremos opuestos. Sin embargo, es posible implementar la interfaz de cola de modo que la cabeza y la cola de la cola estén en el mismo extremo. En ese caso, tendrías una pila. Queue queueA = new LinkedList(); Queue queueB = new PriorityQueue();
  • 121. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 121 09/03/2022 Generic Queue • De forma predeterminada, puede poner cualquier objeto en una cola, pero desde Java 5, Java Generics permite limitar los tipos de objetos que puede insertar en una cola. Aquí hay un ejemplo: • Esta cola ahora solo puede tener instancias de MyObject insertadas en ella. A continuación, puede acceder e iterar sus elementos sin convertirlos. Así es como se ve: Queue<MyObject> queue = new LinkedList<MyObject>(); Queue<MyObject> queue = new LinkedList<MyObject>(); MyObject myObject = queue.remove(); for(MyObject anObject : queue){ //do someting to anObject... } Observe cómo no se necesita conversión en la primera línea y cómo el bucle for-each puede convertir cada elemento de la cola directamente en una instancia de MyObject. Esto es posible porque la cola se creó con MyObject como tipo genérico.
  • 122. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 122 09/03/2022 Add Element to Queue • La interfaz de la cola de Java contiene dos métodos que puede utilizar para agregar elementos a una cola. Estos métodos son el método add () y el método offer (). • Estos dos métodos agregan un elemento al final de la cola. • Los métodos add () y offer () difieren en cómo se comportan si la cola está llena, por lo que no se pueden agregar más elementos. • El método add () arroja una excepción en ese caso, mientras que el método offer () solo devuelve falso. • Aquí hay dos ejemplos de cómo agregar elementos a una cola de Java a través de sus métodos add () y offer (): Queue<String> queue = new LinkedList<>(); queue.add("element 1"); queue.offer("element 2");
  • 123. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 123 09/03/2022 Take Element From Queue • Para tomar un elemento de una cola de Java, puede llamar a su método poll () o remove (). Ambos eliminan el primer elemento de la cola. • Se diferencian en cómo se comportan si la cola está vacía. • El método poll () devuelve un valor nulo si la cola está vacía. • El método remove () genera una excepción si la cola está vacía. • Aquí hay dos ejemplos de cómo tomar un elemento de una cola de Java usando sus métodos poll () y remove (): Queue<String> queue = new LinkedList<>(); queue.add("element 1"); queue.add("element 2"); String element1 = queue.poll(); String element2 = queue.remove();
  • 124. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 124 09/03/2022 Peek at the Queue (1) • Puede echar un vistazo al elemento al principio de una cola sin sacar el elemento de la cola. Esto se hace a través de los métodos element () o peek (). • El método element () devuelve el primer elemento de la cola. Si la Cola está vacía, el método element () arroja una NoSuchElementException. • A continuación, se muestra un ejemplo de cómo mirar el primer elemento de una cola de Java utilizando el método element (): Queue<String> queue = new LinkedList<>(); queue.add("element 1"); queue.add("element 2"); queue.add("element 3"); String firstElement = queue.element();
  • 125. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 125 09/03/2022 Peek at the Queue (2) • El método peek () funciona como el método element () excepto que no lanza una excepción si la Cola está vacía. En su lugar, solo devuelve nulo. • A continuación, se muestra un ejemplo de cómo mirar el primer elemento de una cola utilizando el método peek (): Queue<String> queue = new LinkedList<>(); queue.add("element 1"); queue.add("element 2"); queue.add("element 3"); String firstElement = queue.peek();
  • 126. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 126 09/03/2022 Remove Element From Queue • Para eliminar elementos de una cola de Java, llame al método remove (). Este método elimina el elemento al principio de la cola. • A continuación, se muestra un ejemplo de cómo eliminar un elemento de una cola de Java: Queue<String> queue = new LinkedList<>(); queue.add("element 0"); queue.add("element 1"); String removedElement = queue.remove();
  • 127. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 127 09/03/2022 Remove All Elements From Queue • Puede eliminar todos los elementos de una cola de Java utilizando su método clear (). • El método clear () en realidad se hereda de la interfaz Collection. • Aquí hay un ejemplo de cómo eliminar todos los elementos de una cola de Java a través de su método clear (): queue.clear();
  • 128. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 128 09/03/2022 Get Queue Size • Puede leer la cantidad de elementos almacenados en una cola de Java a través de su método size (). • Aquí hay un ejemplo de cómo obtener el tamaño de una cola de Java a través de su método size (): Queue<String> queue = new LinkedList<>(); queue.add("element 1"); queue.add("element 2"); queue.add("element 3"); int size = queue.size();
  • 129. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 129 09/03/2022 Check if Queue Contains Element • Puede comprobar si una cola de Java contiene un determinado elemento a través de su método contains (). • El método contains () devolverá verdadero si la cola contiene el elemento dado, y falso si no. • El método contains () en realidad se hereda de la interfaz Collection, pero en la práctica eso no importa. • A continuación, se muestran dos ejemplos de comprobación de si una cola de Java contiene un elemento determinado: Queue<String> queue = new LinkedList<>(); queue.add("Mazda"); boolean containsMazda = queue.contains("Mazda"); boolean containsHonda = queue.contains("Honda");
  • 130. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 130 09/03/2022 Iterate All Elements in Queue • También puede iterar todos los elementos de una cola de Java, en lugar de solo procesar uno a la vez. • A continuación, se muestra un ejemplo de iteración de todos los elementos en una cola de Java: Queue<String> queue = new LinkedList<>(); queue.add("element 0"); queue.add("element 1"); queue.add("element 2"); //access via Iterator Iterator<String> iterator = queue.iterator(); while(iterator.hasNext(){ String element = iterator.next(); } //access via new for-loop for(String element : queue) { //do something with each element } Cuando se itera una cola a través de su iterador o mediante el bucle for-each (que también usa el iterador detrás de la escena), la secuencia en la que se iteran los elementos depende de la implementación de la cola.
  • 131. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 131 09/03/2022 java.util Interface Deque<E> • Java 6 now has a Deque interface • There are 12 methods: – Add, remove, or examine an element... – ...at the head or the tail of the queue... – ...and either throw an exception, or return a special value (null or false) if the operation fails
  • 132. Estructuras de datos Carrera de Software Ph.D. Franklin Parrales 132 09/03/2022 Estructuras de datos lineales (listas) Unidad 3 Final de la unidad