Estructuras de datos

Anuncio
Estructuras de datos
Es una colección de datos que se caracteriza por su organización y las
operaciones que se definen en ella. Los datos de tipo estándar pueden se
organizados en diferentes estructuras de datos: estáticas y dinámicas.
Las estructuras de datos estáticas son aquellas en las que el espacio ocupado
en memoria se define en tiempo de compilación y no puede ser modificado
durante la ejecución del programa; por el contrario, en las estructuras de datos
dinámicas el espacio ocupado en memoria puede ser modificado en tiempo de
ejecución. Estructuras de datos estáticas son arrays (arreglos) y las estructuras
dinámicas son listas, árboles y grafos (estas estructuras no son soportadas en
todos los lenguajes).
Arrays (arreglos)
Un array o arreglo es una colección de datos del mismo tipo, que se almacenan
en posiciones consecutivas de memoria y reciben un nombre común. Para
referirnos a una posición o elemento en particular del arreglo, especificamos el
nombre del arreglo y el número de la posición de ese elemento en el arreglo.
En la siguiente figura se muestra un arreglo de enteros llamado c. Este arreglo
contiene doce elementos. Nos podemos referir a cualquiera de estos elementos
dando el nombre del arreglo seguido del número de posición del elemento
especifico encerrado en corchetes (paréntesis cuadrados [ ]).
Programación Orientada a Objetos I I
Profesor: Julio Cesar Meza Ramírez
La posición del primer elemento de cualquier arreglo es la posición
número cero. Así, nos referimos al primer elemento del arreglo c con c[0], al
segundo elemento del arreglo c con c[1], al séptimo elemento del arreglo c con
c[6] y, en general al i-ésimo elemento del arreglo c con c[i-1]. Los nombres de
arreglo obedecen las mismas convenciones que cualquier otro tipo de variable.
El número de posición en corchetes recibe el nombre más formal de subíndice,
Un subíndice debe ser un entero o una expresión entera. Si un programa utiliza
un expresión como subíndice, la expresión se evaluara para determinar el
subíndice. Por ejemplo, si suponemos que la variable a es igual a 5 y la
variable b es igual a 6, entonces el enunciado:
c[a+b]+=2;
Suma 2 al elemento c[11] del arreglo.
Si quisiéramos calcular la suma en los valores contenidos en los tres primeros
elementos del arreglo c y almacenar su suma en la variable suma,
escribiríamos:
Programación Orientada a Objetos I I
Profesor: Julio Cesar Meza Ramírez
suma=c[0]+ c[1]+ c[2];
Si quisiéramos dividir el valor del séptimo elemento del arreglo c entre 2 y
asignar el resultado a la variable x, escribiríamos:
x= c[6] / 2;
Declaración y asignación de almacenamiento de arreglos
Los arreglos ocupan espacio en la memoria. El programador especifica el tipo
de los elementos y usa el operador new para asignar espacio de
almacenamiento al número de elementos requerido por cada arreglo. Para
asignar memoria a los 12 elementos del arreglo c, usamos la siguiente
declaración:
int c[ ] = new int[12];
El arreglo anterior también puede realizarse en dos pasos como sigue:
int c[ ];
c = new int[12];
//declara el arreglo
//asigna memoria al arreglo
Cuando se asigna espacio de almacenamiento a un arreglo, los elementos se
inicializan automáticamente a cero en el caso de variables de tipos de datos
primitivos numéricos, a false en el caso de variables boolean o a null en el caso
de referencias.
Para signar los valores de los elementos en cualquiera de los dos casos
anteriores:
c[0] = -45;
c[1] = 6;
c[2] = 0;
c[3] = 72;
c[4] = 1543;
c[5] = - 89;
c[6] = 0;
c[7] = 62;
c[8] = -3;
c[9] = 1;
c[10] = 6453;
c[11] = 78;
También se puede declarar y darle valores a los elementos del arreglo anterior
de la siguiente manera:
int c[ ] = {-45, 6, 0, 72, 1543, -89, 0, 62, -3, 1, 6453, 78};
Programación Orientada a Objetos I I
Profesor: Julio Cesar Meza Ramírez
Ejemplo:
Imprimir los valores correspondientes a cada uno de los elementos arreglo c.
for(int i=0; i <=11; i++){
System.out.println(c[ i ]);
}
Estructuras dinámicas lineales de datos (Listas enlazadas)
Hasta ahora se ha trabajado con estructuras para las que hemos reservado
memoria n tiempo de compilación estáticas), como arrays, pero hay otro tipo de
estructuras que pueden ampliar o limitar su tamaño mientras se ejecuta el
programa (dinámicas).
Nodo
Es el elemento mínimo de almacenamiento, está compuesto por:
Información – enlace
Presentación:
Listas
Una lista es una secuencia de 0 o más elementos de un tipo dado
almacenados en memoria. Son estructuras lineales, donde cada elemento de la
lista, excepto el primero tiene un único predecesor y cada elemento de la lista,
excepto el último, tiene un único sucesor.
Programación Orientada a Objetos I I
Profesor: Julio Cesar Meza Ramírez
El número de elementos de una lista se llama longitud. Si una lista tiene 0
elementos se denomina lista vacía. En una lista podremos añadir nuevos
elementos o suprimirlos en cualquier posición.
Estas están conformadas por un conjunto de nodos.
Listas en lazadas
Los elementos se almacenan en posiciones de memoria que no son contiguas
o adyacentes, por lo que cada elemento necesita almacenar la posición o
dirección del siguiente elemento de la lista.
Son mucho más potentes y flexibles que los array. La inserción o borrado del
elemento n-ésimo no requiere el desplazamiento de los otros elementos de la
lista.
Presentación (Tomando como ejemplo una lista de enteros):
Limitantes:
• No se puede retroceder.
• No se puede perder la cabeza de la lista.
Codificación:
Para esto es necesario tener en cuenta varios aspectos:
1. El nodo es el componente principal de la lista, pues ella está compuesta
solo por nodos.
2. El nodo es el encargado de almacenar la información que se desea
guardar en la lista.
3. En un nodo se puede almacenar cualquier tipo de dato, incluidos los
objetos.
Programación Orientada a Objetos I I
Profesor: Julio Cesar Meza Ramírez
Algoritmo base:
El algoritmo base de una lista es la clase nodo, en este caso la llamaremos
CNodo:
public class CNodo {
CNodo sig=null;
int info;
public CNodo() {
}
void crearNodo(int inf){
info=inf;
}
}
Como podemos observar, esta clase tiene dos atributos: sig que nos servirá
como apuntador hacia el siguiente nodo, e info que es que contendrá la
información que almacenara el nodo.
La clase anterior tiene dos métodos, uno es el constructor (CNodo) que como
vimos en temas anteriores debe llevar el mismo nombre de la clase, y
“crearNodo()” que es el encargado de darle valor a los atributos de la clase.
Luego de crear la clase CNodo, se debe crear la clase lista, que en este caso la
llamaremos CLista, esta siempre debe tener una cabeza y nunca la debemos
dejar perder, pues nos servirá para recorridos posteriores. En la clase CLista se
ubica todo lo relacionado con la manipulación de los datos a almacenar o
almacenados, por ejemplo, los métodos de creación de la lista, inserción de
nodos, conteo de nodos, etc. Como se muestra a continuación.
public class CLista {
CNodo cab=null;
public CLista() {
}
//Crear lista
String crearLista(CNodo nodo){
if(cab==null){
cab=nodo;
return "Se creo la lista";
}
else{
return "La lista ya existe";
}
Programación Orientada a Objetos I I
Profesor: Julio Cesar Meza Ramírez
}
//Insertar nodo por la izquierda de la lista
String insertarIzq(CNodo nodo){
if(cab!=null){
nodo.sig=cab;
cab=nodo;
return "Se inserto el nodo";
}
else{
return "La lista no existe";
}
}
//Método para contar los nodos que tiene la lista
int contar(){
int cont=0;
CNodo tmp=new CNodo();
tmp=cab;
if(cab==null){
cont=0;
}
else{
while(tmp.sig!=null){
cont++;
tmp=tmp.sig;
}
if(tmp.sig==null){
cont++;
}
}
return cont;
}
}
Nota: Nótese el uso del nodo temporal para el recorrido de la lista, esto debido
a la condición de no perder nunca la cabeza de la estructura de datos.
Lo anterior lo vamos a enlazar con la siguiente interfaz:
Programación Orientada a Objetos I I
Profesor: Julio Cesar Meza Ramírez
Código fuente:
Lo primero que se debe hacer es definir una instancia la clase CLista en el
formulario:
public class formularioPrincipal extends javax.swing.JFrame {
public formularioPrincipal() {
initComponents();
}
CLista objLista=new CLista();
Programación Orientada a Objetos I I
Profesor: Julio Cesar Meza Ramírez
Programación de los botones:
botonCrearLista:
// Crear lista
CNodo objNodo=new CNodo();
objNodo.crearNodo(Integer.parseInt(textoInfo.getText()));
textAreaImprimir.setText(objLista.crearLista(objNodo));
botonInIzq:
// Insertar nodo por la izquierda
CNodo objNodo=new CNodo();
objNodo.crearNodo(Integer.parseInt(textoInfo.getText()));
textAreaImprimir.setText(objLista.insertarIzq(objNodo));
botonImprimir:
// imprimir
textAreaImprimir.setText("");
CNodo tmp=new CNodo();
tmp=objLista.cab;
if(tmp!=null){
for(int i=1; i<=objLista.contar();i++){
textAreaImprimir.setText(textAreaImprimir.getText()+"\n"+tmp.info);
tmp=tmp.sig;
}
}
else{
textAreaImprimir.setText("No existe lista para imprimir");
}
botonSalir:
// Salir
dispose();
Por ultimo enlazamos el formularioPrincipal con el main de la siguiente manera:
public static void main(String[] args) {
formularioPrincipal objFormulario=new formularioPrincipal();
}
Programación Orientada a Objetos I I
Profesor: Julio Cesar Meza Ramírez
Taller
Completar el programa anterior para que pueda llevar a cabo las siguientes
acciones:
1234-
Insertar nodos por la derecha.
Modificar la información de un nodo.
Eliminar nodo por posición.
Eliminar nodo por información.
Programación Orientada a Objetos I I
Profesor: Julio Cesar Meza Ramírez
Descargar