Professional Documents
Culture Documents
Programacin II
Pilas
Una pila es una secuencia de elementos, en la que las operaciones que es posible realizar se limitan a introducir y sacar elementos de uno en uno. Estas operaciones se realizan por uno de sus extremos y slo por uno, al que llamaremos tope o cima. Se cumple, adems, que el elemento que sacamos de la pila es el ltimo que ha sido introducido. Tambin se les denomina estructuras LIFO (Last In First Out), es decir, el ltimo que entra es el primero que sale. El hecho de que las operaciones se realicen slo por un extremo, implica que el nico elemento accesible de la pila es el que se encuentra en el tope. De esto se deduce que para obtener todos los elementos de una pila es necesario destruirla. Las pilas pertenecen al tipo de estructuras de datos lineales, ya que los elementos ocupan lugares sucesivos en la estructura. Un ejemplo intuitivo de pila es una serie de platos puestos uno encima de otro, de tal forma que slo es 'aconsejable' quitar o poner platos del tope superior. Cuando se desea recorrer una secuencia de elementos en sentido inverso, se introducen los elementos en una pila y se van visualizando extrayndolos del tope. Grficamente es comn representar una pila de la forma que indican las figuras:
Ana Mara Clos 1
Programacin II
Programacin II
isVacia() Es un mtodo booleano que devuelve falso o verdadero segn la pila contenga algn elemento o ninguno. isLlena() Es un mtodo booleano que devuelve falso o verdadero segn la memoria tenga o no espacio suficiente para agregar otro elemento a la pila. tope() Devuelve el valor que hay en el tope de la pila, es decir, el ltimo elemento que se introdujo. Si la pila est vaca se considera error. pop() Esta operacin extrae y devuelve el elemento ubicado al tope de la pila. No se pueden suprimir elementos de una pila vaca. push() Inserta un elemento en la parte superior de la pila, pasando ste a ser el nuevo tope de la misma. vaciar() Esta operacin elimina todos los elementos de la pila, y la convierte en una pila vaca.
Programacin II
momento la memoria necesaria para almacenar los elementos que estn presentes en la estructura.
Programacin II
else return null; } public Object tope(){ if(!isVacia()) return tope.elemento; else return null; } public String toString(){ Nodo nodo=tope; String texto=""; while(nodo!=null){ texto=texto+nodo.elemento+"\n"; nodo=nodo.siguiente; } return texto; } private class Nodo{ private Object elemento; private Nodo siguiente; public Nodo(){ } public Nodo(Object e){ elemento=e; siguiente=null; } } }
Programacin II
} Un detalle a tener en cuenta es que la pila funciona con un objeto genrico perteneciente a la clase Object. Cuando se utiliza un mtodo genrico de cualquier Object se puede invocar directamente, como cuando se escribe pila.tope().toString(). Si se necesita usar un mtodo particular de una clase, como getNombre(), que es propio de Persona, hay que convertir el Object en una Persona mediante un cast, como en (Persona)pila.tope().
Programacin II
1.9 Ejercicios
1) Utilizar un men para implementar las funciones bsicas de una pila. 2) Ingresar una lnea de texto. Utilizar una pila para mostrar la lnea invertida. Cada elemento de la pila es un objeto de la clase Character. 3) Utilizar una pila para determinar si una cadena sin espacios ni otros separadores, es palndromo. Con mayor dificultad, considerar que puede tener espacios como separadores. 4) Utilizar una pila para evaluar una expresin postfija (con nmeros dgitos), suponiendo que es vlida. La pila se carga con elementos de tipo Integer. Utilizar como ejemplo 6 2 + 5 * 8 4 / - que se resuelve de la siguiente forma:
Colas
La estructura de cola se puede describir de forma intuitiva con ejemplos de la vida cotidiana. Por ejemplo, las personas esperando para usar un telfono pblico: cuando llega alguien que quiere llamar debe colocarse detrs del ltimo, y la primera persona de la cola ser la primera que use el telfono. Formalmente, podemos definir la estructura cola, como una secuencia de elementos a1,a2,...an, en la que la adicin de nuevos elementos se realiza por un extremo al que llamaremos final, y la extraccin de elementos de la estructura se realiza por el otro, que llamaremos principio.
Ana Mara Clos 7
Programacin II
Los elementos se eliminan en el mismo orden en que se insertaron, por lo tanto el primero que entra en la cola es el primero que sale. Tambin se les denomina estructuras FIFO (First In First Out). En una cola, slo son accesibles los elementos primero y ltimo. Las colas, al igual que las pilas, son estructuras de datos lineales. Grficamente, las colas se representan de la siguiente forma:
Las operaciones que se pueden realizar sobre una cola son similares a las de manejo de pilas. isVacia() Es un mtodo booleano que devuelve false o true segn la cola contenga algn elemento o ninguno. isLlena() Es un mtodo booleano que indica si hay espacio en la memoria para agregar un elemento ms a la cola. agregar()
Ana Mara Clos 8
Programacin II
Aade un elemento al final de la cola. extraer() Elimina el primer elemento de la cola. Es condicin de error si se intenta suprimir un elemento de una cola vaca.
Programacin II
if(isVacia()) principio=nuevo; else fin.siguiente=nuevo; fin=nuevo; return true; } else return false; } public Object extraer(){ if(!isVacia()){ Object elemento=principio.elemento; if(principio==fin) vaciar(); else principio=principio.siguiente; return elemento; } else return null; } public String toString(){ Nodo nodo=principio; String texto=""; while(nodo!=null){ texto=texto+nodo.elemento+"\n"; nodo=nodo.siguiente; } return texto; } }
Programacin II
3.5 Ejercicios
1) Implementar un men para manejo de colas. 2) Cargar una cadena en una cola y en una pila simultneamente. Extraer elementos de la cola y la pila, compararlos y decir si la cadena es un palndromo. 3) Una seccin de un ministerio distribuye nmeros para atencin del pblico de 8 a 9 h. Con un mximo de 50 nmeros y a partir de las 9 comienza a atender. Suponga que todas las personas que retiran nmero se quedan en la cola hasta que la atiendan.
Ana Mara Clos 11
Programacin II
La ventanilla cierra a las 11 horas, por lo tanto, si la suma de los tiempos de atencin supera este mximo quedarn personas sin atender. Informar:
El nmero de personas atendidas. La cantidad de personas que quedaron sin atender. El nombre de la ultima persona atendida y el de la primera
persona sin atender (si existe) Cargar los datos desde un archivo
Listas
Las listas, como las pilas y colas, son estructuras lineales de datos. Esto quiere decir que cada elemento tiene un nico sucesor, (excepto el ltimo) y un nico antecesor (excepto el primero). Las listas pueden implementarse de distintas formas: listas con arrays, listas con cursores y listas con punteros. Las listas son muy verstiles; cualquier elemento pude insertarse, eliminarse, modificarse, consultarse, etc. Pueden crearse en forma ordenada o desordenada.
12
Programacin II
La ventaja de tener una interfaz comn es que puede utilizarse cualquier implementacin, modificando levemente el programa fuente.
Programacin II
4.5.1.
El mtodo add(Elemento e) agrega un elemento al final de la lista. Retorna un valor booleano que indica si se pudo o no agregar. boolean ok = lista.add(articulo); El mtodo add(int indice, Elemento e) agrega un elemento en la posicin indicada. lista.add(5,elemento); Si el ndice est fuera de rango se lanza una excepcin de tipo IndexOutOfBoundsException. Se permiten los ndices entre cero y el tamao de la lista. El mtodo addFirst(Elemento e) agrega un elemento al comienzo de la lista. lista.addFirst(elemento); El mtodo addLast(Elemento e) agrega un elemento al final de la lista. lista.addLast (elemento);
4.5.2.
Programacin II
lista.clear ();
4.5.3.
Retorna true si la lista contiene al elemento considerado. boolean ok=lista.contains(elemento); Debe sobrescribirse el mtodo equals() de la clase Modelo para comparar con un objetos especfico. Por ejemplo, para comparar un rectngulo con otro: public boolean equals(Object o){ Rectangulo rect=(Rectangulo)o; if(base==rect.base && altura==rect.altura) return true; else return false; }
4.5.4.
El mtodo get(int indice) retorna el elemento ubicado en la posicin que se indica. Elemento elemento= lista.get(2); Si el ndice est fuera de rango se lanza IndexOutOfBoundsException. El mtodo getFirst() retorna el primer elemento de la lista. Elemento elemento= lista.getFirst();
15
Programacin II
Si la lista est vaca arroja NoSuchElement Exception. El mtodo getLast() retorna el ltimo elemento de la lista. Elemento elemento= lista.getFirst(); Si la lista est vaca arroja NoSuchElement Exception.
4.5.5.
Retorna el ndice de la primera posicin en que se encuentra el elemento. Si el elemento no se encuentra, retorna -1. Elemento elemento= lista.getFirst();
4.5.6.
El mtodo removeFirst() remueve y retorna el primer elemento de la lista. Elemento elemento= lista.removeFirst(); Si la lista est vaca arroja NoSuchElement Exception. El mtodo removeLast() remueve y retorna el ltimo elemento de la lista. Elemento elemento= lista.removeLast(); Si la lista est vaca arroja NoSuchElement Exception. El mtodo remove(int indice) remueve el elemento ubicado en la posicin indicada.
16
Programacin II
Elemento elemento= lista.remove(2); Si el ndice est fuera de rango arroja NoSuchElementException. El mtodo remove(Object o) remueve el elemento de la lista y retorna true si la lista contiene el elemento. Para que este mtodo funcione debe sobrescribirse el mtodo equals de la clase Modelo que corresponde al elemento a eliminar. boolean ok=lista.remove(empleado);
4.5.7.
Reemplaza el elemento en la posicin indicada con el elemento que se especifica. Retorna el elemento que fue reemplazado. Persona anterior=lista.set(0, new Persona(333,"ema")); Arroja IndexOutOfBoundsException.
4.5.8.
Programacin II
agregar en forma impredecible. Para que los elementos puedan ordenarse genricamente, deben implementar la interfaz Comparable, como se ver despus. import java.util.LinkedList; public class ListaOrdenada <Elemento> extends LinkedList public void agregarOrdenado(Elemento elemento){ Comparable nuevo=(Comparable)elemento; if(this.isEmpty()) this.add(nuevo); else{ Comparable primero=(Comparable)this.getFirst(); Comparable ultimo=(Comparable)this.getLast(); if(nuevo.compareTo(primero)<=0) this.addFirst(nuevo); else if(nuevo.compareTo(ultimo)>=0) this.addLast(nuevo); else{ boolean ubicado=false; int i=0; while(i<this.size() && !ubicado){ Comparable actual= (Comparable) this.get(i); if(nuevo.compareTo(actual)<=0){ this.add(i, nuevo); ubicado=true; } i++; } } } } } {
18
Programacin II
Al querer ordenar los elementos de una lista, se presenta el problema de hacer una comparacin que sea genrica y que no dependa de cada implementacin. Para lograrlo, en la clase Modelo se escribe un mtodo que compare dos atributos que se desee. Por ejemplo, en la clase Persona, se escribe un mtodo para comparar los nombres. Para que sea genrico, la clase debe implementar la interfaz Comparable y el mtodo debe llamarse compareTo(). A continuacin se muestran los cambios en la clase Persona. El primer mtodo compara los nombres y el segundo, los dni. Debe escribirse un solo mtodo, segn el atributo que se desea comparar. El mtodo compareTo() retorna un valor numrico que es negativo si el objeto referenciado por this es anterior al objeto que se pasa como parmetro entre parntesis. Retorna un valor positivo si el objeto this es posterior al parmetro. Retorna 0 si ambos son iguales. public class Persona implements Comparable{ . . . . // atributos y mtodos como siempre public int compareTo(Object o) { Persona p=(Persona)o; int comp=this.nombre.compareTo(p.nombre); return this.nombre.compareTo(p.nombre); } public int compareTo(Object o){ Persona p=(Persona)o; if(this.dni<p.dni) return -1; else if(this.dni>p.dni) return 1; else return 0; }
19
Programacin II
4.9 Ejercicios
1. Construir un programa que permita, dada una lista de valores numricos, determinar cual es el mayor y cual es el menor, en un nico recorrido.
20
Programacin II
2. Dada una lista de nmeros, construir una funcin que determine el promedio de los mismos. 3. Guardar en una lista enlazada los coeficientes de un polinomio en forma descendente, segn el grado. Realizar una funcin que dada la lista de coeficientes y un cierto valor de x retorne el valor del polinomio. Recorrer la lista de atrs hacia delante. 4. Implementar un programa con un men que permita acceder a las siguientes funciones: agregar al principio, al final, eliminar, modificar y mostrar. 5. Realizar un programa lea los registros de un archivo secuencial, inserte los elementos en forma ordenada, los muestre, permita ingresar ms elementos en forma ordenada y al salir del programa almacene los datos en otro archivo secuencial.
21