Beruflich Dokumente
Kultur Dokumente
Listas.
Las estructuras lineales son importantes porque aparecen con mucha frecuencia en
situaciones de la vida: Una cola de clientes en un banco, las pilas de platos en un
restaurante.
Sus caractersticas son que existe un nico elemento, llamado primero y un nico
elemento llamado ltimo, cada elemento excepto el primero tiene predecesor (antes) y
cada elemento excepto el ltimo tiene un nico sucesor (siguiente).
Operaciones que se pueden realizar con las estructuras lineales son: crear la estructura
vaca, insertar un elemento borrar y obtener un elemento. Para definir claramente el
comportamiento de la estructura es necesario determinar en qu posicin se inserta un
elemento nuevo y qu elemento se borrara.
Las principales estructuras lineales son: pilas, colas y listas.
Desde el punto de vista de programacin, una lista es una coleccin de elementos
homogneos, con una relacin lineal entre ellos, es decir, cada elemento excepto el
primero y el ltimo tienen un nico sucesor y un nico predecesor.
Frecuentemente necesitamos tener almacenadas unas k listas de datos en memoria,
sabiendo que el nmero total de datos en memoria no sobre pasa n.
Si disponemos de suficiente memoria, podemos guardar en memoria n arreglos de
tamao k o una matriz de tamao nk, pero no siempre disponemos de tanta memoria.
Ejemplos:
Lista de estudiantes.
Lista de compras.
Lista de empleados.
Lista de Clientes.
Tambin hay veces que se requieren tener listas de nmeros y agregar nmeros a dichas
listas pero no al final ni al principio, sino en medio.
Para solucionar estos y otros problemas, existen las listas enlazadas.
Las listas enlazadas se mencionan en este documento un poco ms adelante.
Tipos de listas.
Entre la descripcin de una lista por parte del usuario y la representacin final de la misma
en la memoria de la computadora, existen decisiones de diseo por parte del
programador. Por ejemplo: ser representada la lista como una estructura secuencial o
enlazada?
En una lista secuencial la colocacin fsica de los elementos coincide con su orden lgico,
es decir, el sucesor de cada elemento est implcito por la posicin del elemento.
En una lista enlazada el orden de sus elementos est determinado por un campo de
enlace explcito en cada elemento, en vez de por su posicin secuencial.
Una lista simplemente enlazada es una coleccin de nodos, cada uno contiendo datos y un
enlace al siguiente nodo de la lista.
Un apuntador externo nos dice donde comienza la lista. No se puede acceder a los nodos
de la lista directamente, habra que acceder al primer nodo mediante el apuntador
externo, al segundo utilizando el SIG del primero y as sucesivamente.
Ejemplo:
lista es un apuntador que contiene la direccin real en memoria del primer nodo.
lista.info guarda lo que contiene la parte INFO del primer nodo.
lista.sig guarda el contenido de la parte SIG del primer nodo, es decir la direccin de su
siguiente nodo.
Ejemplo:
lista = 50 (imaginemos que 50 es la direccin real en memoria del primer nodo)
lista.info =A
lista.sig = 100
NULL es una constante que puede ser asignada a una variable apuntador indicando
que no se apunta a nada. (No es lo mismo que cero).
Ejemplo: LISTA=NULL;
El puntero anterior (ANT) del primer elemento debe apuntar hacia NULL (el inicio de la
lista).
El puntero siguiente (SIG) del ltimo elemento debe apuntar hacia NULL (el fin de la lista).
Nota: para tener una idea ms clara de cmo se trabaja con las listas doblemente
enlazadas dejo el siguiente link para su revisin.
http://es.kioskea.net/faq/2872-listas-doblemente-enlazadas
Listas circulares.
La lista circular es una especie de lista enlazada simple o doblemente enlazada, pero que
posee una caracterstica adicional para el desplazamiento dentro de la lista, est no tiene
fin.}
Para que la lista sea sin fin, el puntero siguiente del ltimo elemento apuntar hacia el
primer elemento de la lista en lugar de apuntar al valor NULL, como hemos visto en el
caso de listas doblemente enlazadas.
En las listas circulares, nunca se llega a una posicin en la que ya no sea posible
desplazarse.
Cuando se llegue al ltimo elemento, el desplazamiento volver a comenzar desde el
primer elemento.
Lista circular simplemente enlazada.
Cada nodo tiene un enlace, similar al de la lista simplemente enlazada, excepto que el
siguiente nodo del ltimo apunta al primero.
Como en una lista enlazada simple, los nuevos nodos pueden ser solo eficientemente
insertados despus de uno que ya tengamos referenciado. Por esta razn, es usual
quedarse con una referencia solamente al ltimo elemento en una lista enlazada circular
simple, esto nos permite rpidas inserciones al principio, y tambin permite el acceso al
primer nodo desde el puntero del ltimo nodo.
Aplicaciones.
Las listas enlazadas son usadas como mdulos para otras muchas estructuras de datos,
tales como pilas, colas y sus variaciones.
El campo de datos de un nodo puede ser otra lista enlazada. Mediante mecanismos,
podemos construir muchas estructuras de datos enlazadas con listas; esta prctica tiene
su origen en el lenguaje de programacin Lisp ("LISt Processing" (Proceso de LIStas)),
donde las listas enlazadas son una estructura de datos primaria, y ahora es una
caracterstica comn en el estilo de programacin funcional.
A veces, las listas enlazadas son usadas para implementar arreglos asociativos, y estas en
el contexto de las llamadas listas asociativas. Hay pocas ventajas en este uso de las listas
enlazadas: hay mejores formas de implementar stas estructuras, por ejemplo con rboles
binarios de bsqueda equilibrados. Sin embargo, a veces una lista enlazada es
dinmicamente creada fuera de un subconjunto propio de nodos semejantes a un rbol, y
son usadas ms eficientemente para recorrer sta serie de datos.
Pilas.
Una pila (stack en ingls) es una lista ordenada o estructura de datos en la que el modo de
acceso a sus elementos es de tipo LIFO (del ingls Last In First Out, ltimo en entrar,
primero en salir) que permite almacenar y recuperar datos. Esta estructura se aplica en
multitud de ocasiones en el rea de informtica debido a su simplicidad y ordenacin
implcita de la propia estructura.
Para el manejo de los datos se cuenta con dos operaciones bsicas: apilar (push), que
coloca un objeto en la pila, y su operacin inversa, retirar (o desapilar, pop), que retira el
ltimo elemento apilado.
En cada momento slo se tiene acceso a la parte superior de la pila, es decir, al ltimo
objeto apilado (denominado TOS, Top of Stack en ingls). La operacin retirar permite la
obtencin de este elemento, que es retirado de la pila permitiendo el acceso al siguiente
(apilado con anterioridad), que pasa a ser el nuevo TOS.
Por analoga con objetos cotidianos, una operacin apilar equivaldra a colocar un plato
sobre una pila de platos, y una operacin retirar a retirarlo.
Las pilas suelen emplearse en los siguientes contextos:
Implementacin de recursividad.
Historia
El mtodo de pila para la evaluacin de expresiones fue propuesto en 1955 y dos aos
despus patentado por Friedrich L. Bauer, quin recibi en 1988 el premio "IEEE Computer
Society Pioneer Award" por su trabajo en el desarrollo de dicha estructura de datos.
Pila como tipo abstracto de datos
A modo de resumen tipo de datos, la pila es un contenedor de nodos y tiene dos
operaciones bsicas: push (o apilar) y pop (o desapilar). 'Push' aade un nodo a la parte
superior de la pila, dejando por debajo el resto de los nodos. 'Pop' elimina y devuelve el
actual nodo superior de la pila. Una metfora que se utiliza con frecuencia es la idea de
una pila de platos en una cafetera con muelle de pila. En esa serie, slo la primera placa
es visible y accesible para el usuario, todas las dems placas permanecen ocultas. Como se
aaden las nuevas placas, cada nueva placa se convierte en la parte superior de la pila,
escondidos debajo de cada plato, empujando a la pila de placas. A medida que la placa
superior se elimina de la pila, la segunda placa se convierte en la parte superior de la pila.
Dos principios importantes son ilustrados por esta metfora: En primer lugar la ltima
salida es un principio, la segunda es que el contenido de la pila est oculto. Slo la placa
de la parte superior es visible, por lo que para ver lo que hay en la tercera placa, el primer
y segundo platos tendrn que ser retirados.
tope--;
}
}
public static void main(String[] args) {
pilaestatica p = new pilaestatica();
String r;
Scanner cap1= new Scanner(System.in);
Scanner cap= new Scanner(System.in);
tope=0;
h: do{
System.out.println("Menu Principal: \nQue desea hacer con la pila?");
System.out.println("1.- Insertar");
System.out.println("2.- Eliminar");
System.out.println("3.- Imprimir");
System.out.println("4.- Salir");
op=cap.nextInt();
switch(op){
case 1:
{
p.Insertar();
}
break;
case 2:
{
p.Eliminar();
}
break;
case 3:
{
p.Imprimir();
}
break;
case 4:
{
System.out.println("Adios!!!");
}
break h;
default:
System.err.println("Seleccion erronea, teclea otra opcion esa opcion no existe!!!");
}
System.out.println("Deseas realizar otra operacion con tu pila?(S/N)");
r=cap1.nextLine();
}while(r.equalsIgnoreCase("S"));
}
}
case 3:
System.out.println("se borra el nodo final");
pila.removeLast();
break;
case 4:
System.out.println("la pila es la siguiente");
List pila2= new ArrayList(pila);
Iterator it = pila2.iterator();
while (it.hasNext()){
System.out.println(it.next()+"");
}
break;
case 5:
System.out.println("al rato");
break;
}
}
while (op !=5); }
Implementacin en Java
public class Nodo<tipo> {
public tipo dato;
private Nodo<tipo> siguiente;
public Nodo(tipo Dato) {
dato = Dato;
siguiente = null;
}
public void conectar(Nodo<tipo> elSiguiente) {
siguiente = elSiguiente;
}
public Nodo<tipo> getSiguiente() {
return siguiente;
}
}
public class Pila<tipo> {
Nodo<tipo> cima;
public Pila() {
cima = null;
}
public int tamano() {
Nodo<tipo> lectorAuxiliar = cima;
int contadorDeDatos = 0;
while (lectorAuxiliar != null) {
contadorDeDatos++;
lectorAuxiliar = lectorAuxiliar.getSiguiente();
}
return contadorDeDatos;
}
public void apilar(tipo datoNuevo) {
Nodo<tipo> nuevo = new Nodo<tipo>(datoNuevo);
nuevo.conectar(cima);
cima = nuevo;
}
public tipo desapilar() {
tipo dato = cima.dato;
cima = cima.getSiguiente();
return dato;
}
public tipo getCima() {
return cima.dato;
}
public boolean estaVacia() {
return cima == null;
}
public String toString() {
Nodo<tipo> lectorAuxiliar = cima;
String respuesta = "IN/OUT <->";
while (lectorAuxiliar != null) {
respuesta += " [" + lectorAuxiliar.dato.toString() + "] ";
lectorAuxiliar = lectorAuxiliar.getSiguiente();
}
return respuesta;
Vaca: devuelve cierto si la pila est vaca o falso en caso contrario (empty).
Aplicaciones.
Las pilas son utilizadas ampliamente para solucionar una amplia variedad de problemas.
Se utiliza en compiladores, sistemas operativos y en programas de aplicacin.
Las pilas son un EDs muy usadas en la solucin de diversos tipos de problemas, en el rea
de computacin. Algunos de los casos ms representativos de aplicacin de las mismas
son:
Llamadas a subprogramas
Recursividad
Tratamiento de expresiones aritmticas
Ordenacin
Colas.
La particularidad de una estructura de datos de cola es el hecho de que slo podemos
acceder al primer y al ltimo elemento de la estructura. As mismo, los elementos slo se
pueden eliminar por el principio y slo se pueden aadir por el final de la cola.
Ejemplos de colas en la vida real seran: personas comprando en un supermercado,
esperando para entrar a ver un partido de bisbol, esperando en el cine para ver una
pelcula, una pequea peluquera, etc. La idea esencial es que son todos lneas de espera.
Elem n
0
1
2
3
4
5
6
7
n-1
Elem 2
Elem 3
Elem n
Cola circular
Una cola circular o anillo es una estructura de datos en la que los elementos estn de
forma circular y cada elemento tiene un sucesor y un predecesor. Los elementos pueden
cosultarse, aadirse y eliminarse nicamente desde la cabeza del anillo que es una
posicin distinguida. Existen dos operaciones de rotaciones, una en cada sentido, de
manera que la cabeza del anillo pasa a ser el elemento sucesor, o el predecesor,
respectivamente, de la cabeza actual.
Colas dobles
La bicola o doble cola es un tipo de cola especial que permiten la insercin y eliminacin
de elementos de ambos extremos de la cola.
Puede representarse a partir de un vector y dos ndices, siendo su representacin ms
frecuente una lista circular doblemente enlazada.
Todas las operaciones de este tipo de datos tienen coste constante.
// ArrayCircularQueue.java
package com.javajeff.cds;
public class ArrayCircularQueue implements Queue {
private int front = 0, rear = 0;
private Object [] queue;
public ArrayCircularQueue (int maxElements) {
queue = new Object [maxElements];
}
Implementacin en Java
Partimos a partir de la implementacin en Java utilizando clases.
package colaPrioridadSimpleEnlazada;
import colaException.*;
public class ColaPrioridad<T> implements colaPrioridadInterface.ColaPrioridad {
class Celda<T> {
T elemento;
int prioridad;
Celda sig;
}
private Celda cola;
public ColaPrioridad() {
cola = new Celda();
cola.sig = null;
}
public boolean vacia() {
return (cola.sig==null);
}
public <T> primero() throws ColaVaciaException {
if (vacia()) throw new ColaVaciaException();
return cola.sig.elemento;
}
public int primero_prioridad() throws ColaVaciaException {
if (vacia()) throw new ColaVaciaException();
return cola.sig.prioridad;
}
public void inserta(T elemento, int prioridad) {
Celda<T> p,q;
boolean encontrado = false;
p = cola;
while((p.sig!=null)&&(!encontrado)) {
if (p.sig.prioridad<prioridad)
encontrado = true;
else p = p.sig;
}
q = p.sig;
p.sig = new Celda();
p = p.sig;
p.elemento = elemento;
p.prioridad = prioridad;
p.sig = q;
}
public void suprime() throws ColaVaciaException {
if (vacia()) throw new ColaVaciaException();
cola = cola.sig;
}
} // fin clase ColaPrioridad