Est Datos
Est Datos
Est Datos
Dinámicas
1. Pilas
2. Colas
3. Listas enlazadas
1. Simples
2. Dobles
Estructuras de Datos
Almacenamiento
Contiguo
Lineales
Estructuras Almacenamiento
de Datos No Contiguo
No lineales
Operaciones Básicas en Estructuras
Lineales
1. Recorrido: Procesa c/elemento de la estructura.
2. Búsqueda: Recupera la posición de un elemento específico.
3. Inserción: Adiciona un nuevo elemento a la estructura.
4. Borrado: Elimina un elemento de la estructura.
5. Ordenación: Ordena los elementos de la estructura de
acuerdo a los valores que contiene.
6. Mezcla: Combina 2 estructuras en una sola.
PILAS
Definición:
Estructura de datos lineal donde los elementos
pueden ser añadidos o removidos solo por un
extremo.
Trabajan con filosofía LIFO (Last In- First Out ).
Ejemplos:
•Pila de platos
•Pila de discos
•Pila de llamadas a funciones
•Pila de recursion
•Pila de resultados parciales de formulas aritméticas, etc.
OPERACIONES BASICAS CON
PILAS
-PUSH (insertar).- Agrega un elementos a la pila en el
extremo llamado tope.
-POP (remover).- Remueve el elemento de la pila que
se encuentra en el extremo llamado tope.
-VACIA.- Indica si la pila contiene o no contiene
elementos.
-LLENA.- Indica si es posible o no agregar nuevos
elementos a la pila.
REPRESENTACIÓN DE PILAS:
• Usando arreglos: Define un arreglo de una dimensión
(vector) donde se almacenan los elementos.
0 1 2 3 4 5
Inicio: A: B: C: elemento
C
B B B
A A A A
interface IPila {
public boolean llena();
public boolean vacia();
public void push (int elem);
public int pop();
}
Implementación usando un arreglo:
class Pila implements IPila {
int tope = -1; public boolean vacia(){
private int [] pila = new int [10]; return (tope == -1);
final int MAX = 9; }
public boolean llena(){
return ( tope == MAX ); public int pop(){
} if (this.vacia()) then
public void push (int elem){ // ERROR
if (this.llena()) then else{
// ERROR int x = pila[tope];
else{ tope --;
tope ++; return x;
pila [ tope ] = elem; }
} }
} }
public class Stack {
private Vector items; Implementación usando un Vector
public Stack() {
items = new Vector(10);
}
public Object push(Object item){
items.addElement(item);
return item;
}
public synchronized Object pop(){
int len = items.size();
Object obj = null;
if (len == 0) throw new EmptryStackException();
obj = items.elementAt(len-1);
items.removeElementAt(len –1);
return obj;
}
public boolean isEmpty() {
if (items.size == 0) return true;
else return false;
}
}
Aplicaciones de Pilas
EXPRESIONES ARITMETICAS:
Una expresión aritmética contiene constantes, variables
y operaciones con distintos niveles de precedencia.
OPERACIONES :
^ potencia
*/ multiplicación, división
+,- suma, resta
NOTACIONES:
NOTACION INFIJA:
Los operadores aparecen en medio de los operandos.
A + B, A – 1, E/F, A * C , A ^ B , A + B + C, A+B-C
NOTACION PREFIJA:
El operador aparece antes de los operandos.
+ AB, - A1, /EF, *AC, ^AB, +AB+C, +AB-C
NOTACION POSTFIJA:
El operador aparece al final de los operandos.
AB+, A1-, EF/, AC*, AB^, AB+C+, AB+C-
PASOS PARA EVALUAR UNA
EXPRESION:
// Funcion fibonacci
public static int fib(int n) {
if (n==1) return 0;
else if (n==2) return 1;
else return fib(n-1)+fib(n-2);
}
Aplicaciones de Pilas
Control de secuencia de programas.
• Las pilas son requeridas para implementar
el control de flujo de ejecución de un
programa con subprogramas (funciones,
procedimientos o métodos).
– Subprogramas recursivos o no recursivos
– Existen llamadas a ejecución de subprogramas.
– Un subprograma se ejecuta completamente
antes de retornar al punto donde fue llamado.
Aplicaciones de Pilas
Control de secuencia de programas.
// Programa Principal
class Principal{ Cual es la
public static void proceso1(){ salida de este
System.out.println(“proceso1”);
programa?
proceso2();
…
}
public static void proceso2(){
System.out.println(“proceso2”);
…
}
public static void main(String[] args){
proceso1();
proceso2();
…
}
}
Clase Stack en Java
La clase Stack representa una pila de objetos donde el último
en entrar es el primero en salir (LIFO). Extiende la clase
Vector con 5 operaciones básicas.
java.util
Class Stack<E>
java.lang.Object
java.util.AbstractCollection<E>
java.util.AbstractList<E>
java.util.Vector<E>
java.util.Stack<E>
All Implemented Interfaces:
Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess
Method Summary
boole empty()
an Tests if this stack is empty.
E peek()
Looks at the object at the top of this stack without removing it
from the stack.
E pop()
Removes the object at the top of this stack and returns that
object as the value of this function.
E push(E item)
Pushes an item onto the top of this stack.
int search(Object o)
Returns the 1-based position where an object is on this stack.
COLAS
Ejemplos:
1.- Insertar A A
2.- Insertar B A B
3.- Insertar C A B C
5.- Insertar D
B C D
0 1 2 3 4 5
A F S D Z
Frente Final
• Cuando la cola esta vacía las variables frente y final
son nulos y no es posible remover elementos.
Final
Al remover un elemento:
Frente Final Frente Final
B C B C
B C B C
Insertar elemento D:
Frente Final Frente Final
B C D B C D
Insertar elemento E:
Frente Final Frente Final
B C D E B C D E
Insertar elemento F:
Frente Final Frente Final
B C D E F B C D E F
Frente Final
Es una representación Remover
lógica de la cola en C D
un arreglo.
El frente y final son Frente Final
movibles. Insertar E
Cuando el frente o final C D E
llegan al extremo se
Final Frente
regresan a la primera
posición del arreglo. Insertar F
F C D E
Representación de colas:
• Usando memoria estática: arreglos con tamaño fijo y
frente fijo o movible o represntación circular.
Final
Frente B C D E F
0 1 2 3 4
Frente
Interfase de un TDA llamado ICola:
interface ICola{
public boolean llena();
public boolean vacia();
public void insertar (Object elem);
public Object eliminar();
}
Implementación de una cola:
Implementacion usando Implementacion usando
Object parametros de tipo
class Cola implements ICola { class Cola<T> implements ICola<T> {
private Object[] cola; private T[] cola;
private int frente = -1; private int frente = -1;
private int fin = -1; private int fin = -1;
private int size; private int size;
public Cola(int s){ public Cola(int s){
size = s-1; size = s-1;
cola = new Object[s]; cola = new T[s];
} }
public boolean vacia(){ public boolean vacia(){
return (frente == -1); return (frente == -1);
} }
public boolean llena(){ public boolean llena(){
return ( fin == size ); return ( fin == size );
} }
public void insertar( Object elem) { public void insertar( T elem) {
if ( frente == -1 ) ...
frente ++; }
else public T eliminar(){
if ( fin == size) …
ERROR Cola Llena! }
fin ++;
cola[fin]=elem; }
}
}
public Object eliminar(){
…
}
}
Ejercicio.
• Definir una clase Cola con las operaciones
básicas en 3 implementaciones diferentes:
– Con tamaño fijo y frente fijo. Desplazamiento de
elementos cada vez que se remueve un elemento.
– Con tamaño fijo y frente movible.
Desplazamiento de elementos cuando el final llegue al
límite del arreglo y existan elementos vacíos al frente.
– Con tamaño variable.
• Incrementar el tamaño del arreglo cuando la cola
este llena.
Colas en Java
• Java contiene la definición de interfaces y
clases para el manejo de colas.
• Las colas son una colección de elementos
diseñadas para almacenar elementos que
esperan ser procesados.
• Java contiene una interfase parametrizada
Queue<E> y varias clases que que la
implementan, entre ellas PriorityQueue<E>
Colas en Java
public interface Queue<E> extends Collection<E> {
E element();
boolean offer(E o);
E peek();
E poll();
E remove();
}
Method Summary
E element()
Retrieves, but does not remove, the head of this queue, it throws an exception if this
queue is empty..
bool offer(E o)
ean Inserts the specified element into this queue, if possible.
E
peek()
Retrieves, but does not remove, the head of this queue, returning null if this queue is
empty.
E
poll()
Retrieves and removes the head of this queue, or null if this queue is empty.
E remove()
Retrieves and removes the head of this queue.
Cola de Prioridad en Java
java.util
Class PriorityQueue<E>
java.lang.Object
java.util.AbstractCollection<E>
java.util.AbstractQueue<E>
java.util.PriorityQueue<E>
Type Parameters:
E - the type of elements held in this collection
All Implemented Interfaces:
Serializable, Iterable<E>, Collection<E>, Queue<E>
Constructor Summary
PriorityQueue()
Creates a PriorityQueue with the default initial capacity (11) that orders its elements according to
PriorityQueue(int initialCapacity)
Creates a PriorityQueue with the specified initial capacity that orders its elements according to
their natural ordering (using Comparable).
specified comparator.
Iterator<E> iterator()
Returns an iterator over the elements in this queue.
boolean offer(E o)
Inserts the specified element into this priority queue.
E peek()
Retrieves, but does not remove, the head of this queue, returning null if this queue is empty.
E poll()
Retrieves and removes the head of this queue, or null if this queue is empty.
boolean remove(Object o)
Removes a single instance of the specified element from this queue, if it is present.
int size()
Returns the number of elements in this collection.
Tablas Hash
java.util
Class Hashtable<K,V>
java.lang.Object
java.util.Dictionary<K,V>
java.util.Hashtable<K,V>
import java.util.Hashtable;
public class Tabla{
public static void main (String[] arg){
Hashtable<String, Integer> numeros = new Hashtable<String, Integer>();
numeros.put("uno",1);
numeros.put("dos", new Integer(2));
Integer n = numeros.get("dos");
if (n != null) System.out.println(n);
}
}
Constructores de Tablas hash
Constructor Summary
Hashtable()
Constructs a new, empty hashtable with a default initial capacity (11) and load factor, which is 0.75.
Hashtable(int initialCapacity)
Constructs a new, empty hashtable with the specified initial capacity and default load factor, which is 0.75.
Hashtable(int initialCapacity, float loadFactor)
Constructs a new, empty hashtable with the specified initial capacity and the specified load factor.
4
Jamón 7 •La lista se recorre desde el
5 inicio y hasta encontrar un
6 elemento que contenga un
7
enlace vacío.
Leche 0
LISTAS
Una lista es una colección lineal de elementos llamados nodos
donde el orden de los mismos se establece mediante punteros o
referencias y existe un puntero/referencia especial llamado inicio
para localizar al primer elemento.
Ejemplos:
Información enlace
inicio
* Lista enlazada de 4 elementos
Los nodos de las listas
Un nodo se divide en 2 partes:
• Información: Contiene la información del elemento.
• Enlace: Contiene la dirección del siguiente nodo de la
lista.
public class Nodo{
información enlace // atributos
public String informacion;
Nodo public Nodo enlace;
// el constructor de nodos
Nodo (String n){
informacion = n;
enlace = null;
}
}
Almacenamiento de datos:
fin
Ejemplo
Implementación de una cola de datos String usando una lista
class Cola_Lista { public void insertar (String e ){
class Nodo{ Nodo n = new Nodo(e);
String nombre; if (this.vacia() ) {
Nodo enlace; frente = n;
Nodo (String n){ fin = n;
nombre = n; }
enlace = null; else {
} fin.enlace= n;
} fin = n;
Nodo frente; }
Nodo fin; }
Cola_Lista(){ public String eliminar(){
frente=null; Nodo n = frente;
fin=null; if (frente != null) {
} frente = n.enlace;
public boolean vacia(){ if (frente==null)
return (frente == null); fin = null;
} return n.nombre;
public boolean llena(){ }
return false; else “ERROR”; //return null; // excepción
} }
} // final de la clase
Ejercicio
Implementar una pila usando una lista ligada.
La pila contiene números enteros.
tope 10 7 4 2
Implementación de una pila de datos Integer usando una lista
class Pila_Lista { public Integer pop(){
class Nodo{ if (tope != null) {
Integer dato; Nodo n = tope;
Nodo enlace; tope = tope.enlace;
Nodo (Integer n){ return n.dato;
dato = n; }
enlace = null; else “ERROR”;
} }
} public void push(Integer elem){
Nodo tope; Nodo n = new Nodo(elem);
Pila_Lista(){ n.enlace = tope;
tope=null; tope = n;
} }
public boolean vacia(){ }
return (tope == null);
}
public boolean llena(){
return false;
}
Tipos parametrizados
• Define una clase para implementar una Pila/Cola
usando una lista. Los datos que se almacenaran
serán tipo Object.
• Que requiere un programa que use estas
estructuras?
• Define una clase parametrizada para implementar
una Pila usando una lista.
• Define una clase parametrizada para implementar
una Cola usando una lista.
LISTAS DOBLES
Una lista doble es una estructura lineal de elementos llamados
nodos los cuales contienen dos campos de enlace: uno al
elemento anterior y otro al elemento siguiente de la lista.
inicio A
fin
Lista de tres elementos
inicio A B C
fin
Operaciones con listas dobles
• Insertar: Agrega un elemento a la lista.
• Eliminar: Retira un elemento de la lista.
• Buscar: Busca un elemento en la lista.
• Recorrer hacia adelante: Visita todos los elementos de la lista
desde el inicio hasta el final.
• Recorrer hacia atrás: Visita todos los elementos de la lista
desde el final hasta el inicio.
• Vacía: Indica si la lista contiene o no elementos.
• Tamaño: Indica el número de elementos de la lista.
Inicio
Nodo cabecera
Nodo cabecera
Inicio