Estructuras de Datos Material Elaborado por el Profesor Ricardo González A partir de Materiales de las Profesoras Angela Di Serio Mariela Curiel Estructuras de datos Los programadores de lenguaje ensamblador piensan en término de datos simples: caracteres, enteros, números en punto flotante. Sin embargo, mientras más complejo es el problema que deseamos resolver, las estructuras de datos dejan de ser simples y se hace necesario emplear estructuras más elaboradas como los arreglos, Strings, Clases, listas, pilas y árboles. Cada una de estas abstracciones pueden construirse a partir de elementos más simples como lo son: direcciones de memoria, caracteres, enteros y números en punto flotante Objetos Para los propósitos de esta clase consideraremos que un objeto es una abstracción en la que se especifica una estructura de datos y las operaciones que permiten operar con dicha estructura de datos. La creacción de la estructura en si se realiza con la llamada al constructir de la clase (new), en este momento es que se reserva espacio de memoria para almacedar los datos que contiene el objeto. La referencia a los objetos se realiza al asignar apuntadores a las direcciones de las estructuras. Ejemplo 1 de un objeto Clase Point Point origen_uno => Public clas Point { origen_uno public int x=0; public int y=0; public Point(int x, int y) { this.x = x; this.y = y; Cuando hacemos un new lo que ocurre es: } Point origen_uno = new Point(23, 50); } x origen_uno y 23 30 Objeto Point Ejemplo 1 de un objeto Clase Point X Y X Objeto p Y p p = new Point( a, b) lw lw li li syscall move sw sw sw $t3, a $t4, b $a0, 8 $v0, 9 $t5, $v0 $t3, 0 ($t5) $t4, 4 ($t5) $t5, p p.getY() lw lw move jr $t2, p $t3, 4 ($t2) $v0, $t3 $ra Ejemplo 2 de un objeto Clase Rectangle x Public clas Rectangle{ public int width; public int height; public Point origin; y origen_uno Cuando hacemos un new lo que ocurre es: 23 30 public Rectangle(Point p,int x, int y) { origin = p; Rectangle origen_uno = new Rectangle(origen_uno, 23, 50); width = x; height = y; width 23 } } height rectangulo origin Objeto Rectangle 30 Ejemplo 2 de un objeto Clase Rectangle alto Rectangle(Point p, int a, int l ) largo Objeto r1 r1 r1 = new Rectangle( p1, a1, l1) lw lw lw li li syscall move sw sw sw sw $t2, p $t3, a $t4, l $a0, 12 $v0, 9 $t5, $v0 $t2, 0 ($t5) $t3, 4 ($t5) $t4, 8 ($t5) $t5, r1 alto largo X Y Ejemplo 2 de un objeto r2 alto largo X Y r2 = new Rectangle ( int x, int y, int a, int l) lw lw lw lw li li syscall move sw sw li li syscall move sw sw sw jr $t0, x $t1, y $t2, a $t3, l $a0, 8 $v0, 9 $t5, $v0 $t0, 0 ($t5) $t1, 4 ($t5) $a0, 12 $v0, 9 $t6, $v0 $t5, 0 ($t6) $t2, 4 ($t5) $t3, 8 ($t5) $ra Pilas B Una pila es una estructura de datos que permite implementar la disciplina FILO (First In Last Out) Para utilizar la pila se emplean al menos dos valores diferentes, uno para indicar la direccion de la pila y otro para el tope o último elemento incluido en la pila. C B A A Si la pila crece de las direcciones altas a las direcciones bajas de la memoria . X apilar ( X ) B tope A lw subi lw sw $t0, tope $t0, $t0, 4 $t1, X $t1, 0($t0) tope B A pila pila desapilar ( ) B tope A pila lw lw addi jr $t0, tope $v0, 0 ( $t0 ) $t0, $t0, 4 $ra A tope pila Pilas Si los datos a almacenar en la pila son de longitud variable y/o no se sabe a priori el tamaño de los nodos a incluir en la pila, es posible que se requieran otras estructuras para manejar la pila. $sp Variables Locales $fp Registros Guardados ... Argumento 6 $sp $fp Argumento 5 Variables Locales Variables Locales Registros Guardados Registros Guardados ... ... Argumento 6 Argumento 6 Argumento 5 Argumento 5 Colas Una cola es una estructura de datos que permite implementar la disciplina FIFO (First In First Out) Para utilizar la cola se emplean al menos dos valores diferentes, uno para la cabeza de la cola y otro para el final, cola o extremo de la cola. Memoria Memoria 6 extremo cabeza 1 2 2 3 3 4 4 5 5 6 cabeza 1 extremo 6 extremo 7 Agregar(7) 5 4 3 2 1 cabeza Arreglos de una dimensión (vectores) Los arreglos son colecciones ordenadas de datos que poseen el mismo tipo y formato de datos en sus elemenos constitutivos. Memoria V 7 3 9 2 4 5 V[0] V[1] V[2] V[3] ,V[4] V[5] 7 V+0 3 V+4 9 V+8 2 V + 12 4 V + 16 5 V + 20 Arreglos de dos dimensiones (matrices) 0 1 Memoria M[0,0] 1 M[0,1] 5 M[0,2] 0 1 2 3 1 9 5 3 6 1 3 4 Memoria M[0,0] 1 M[1,0] 9 6 M[0,1] 5 M[0,3] 3 M[1,1] 3 M[1,0] 9 M[0,2] 6 M[1,1] 3 M[1,2] 1 M[1,2] 1 M[0,3] 3 4 M[1,3] 4 M[1,3] Fila 0 Fila 1 Almacenamiento por filas Columna 0 Columna 1 Columna 2 Columna 3 Almacenamiento por columnas Arreglos de dos dimensiones (matrices) Memoria M M[0,0] 1 M[0,1] 5 M[0,2] 6 M[0,3] 3 M[1,0] 9 M[1,1] 3 M[1,2] 1 M[1,3] 4 Fila 0 Para calcular el desplazamiento de un elemento con respecto al origen de la matriz, se emplea la siguiente fórmula Fila 1 Almacenamiento por filas Dir efectiva = Dirección de M + ( fila i * número de elementos en una fila * tamaño de un elemento ) + ( columna j * tamaño de un elemento ) M M[0,0,0] M[0,0,1] M[0,0,2] M[0,0,3] M[0,1,0] M[0,1,1] M[0,1,2] M[0,1,3] M[1,0,0] M[1,0,1] M[1,0,2] M[1,0,3] M[1,1,0] M[1,1,1] M[1,1,2] M[1,1,3] Matrices multidimensionales