Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


Cuaderno de ejercicios Estructuras de datos, Ejercicios de Estructuras de Datos y Algoritmos

Autoría de Silvia Guardati. Cuaderno de ejercicios Estructuras de datos. Contiene buena cantidad de ejercicios para practicar estrucutras de datos en cualquier lenguaje.

Tipo: Ejercicios

2024/2025

Subido el 14/04/2026

ivan-nava-b
ivan-nava-b 🇲🇽

1 documento

1 / 48

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
Cuaderno de Ejercicios de ED- Elaborado por: Silvia Guardati
1
División Académica de Ciencias de Datos
Departamento Académico de Computación
Estructuras de Datos
Cuaderno de Ejercicios
Enero 2024
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30

Vista previa parcial del texto

¡Descarga Cuaderno de ejercicios Estructuras de datos y más Ejercicios en PDF de Estructuras de Datos y Algoritmos solo en Docsity!

División Académica de Ciencias de Datos

Departamento Académico de Computación

Estructuras de Datos

Cuaderno de Ejercicios

Enero 2024

Contenido

  • Introducción
  • Conceptos básicos de la POO
  • Estructura de datos Pila
  • Estructura de datos Conjunto
  • Recursión
  • Estructura de datos Cola
  • Estructuras enlazadas..................................................................................................................
  • Estructura de datos Lista
  • Apéndices
    • A - Uso del depurador ( debugger ) en NetBeans
    • B - Escritura/lectura de objetos en/de archivos
    • C - Pruebas Unitarias
    • D – Inclusión de clases definidas en otros proyectos

Conceptos básicos de la POO: herencia, polimorfismo, clases abstractas,

interfaces, sobreescritura y sobrecarga de métodos.

PROBLEMA 1

Escribe las clases que se mencionan más abajo. Luego tu programa y asegúrate que genera resultados correctos. Clase “Rectángulo” tal como se indica en el diagrama UML: Rectángulo

  • lado1: double
  • lado2: double
  • Rectángulo()
  • Rectángulo(double, double)
  • setLado1(double): void
  • setLado2(double): void
  • getLado1(): double
  • getLado2(): double
  • equals(Object): boolean
  • toString(): String
  • calculaArea(): double
  • calculaPerimetro(): double Clase “ComplejoVacacional” que tiene como atributos el nombre del complejo vacacional y los datos de sus numAlb albercas (1≤ numAlb ≤ 10). Todas las albercas tienen forma rectangular. Decide qué métodos incluir en esta clase, si el comportamiento esperado de la misma es:
  1. Calcular y regresar el total de metros de lona que se necesita para cubrir la superficie de todas las albercas.
  2. Calcular y regresar el total de metros lineales requeridos para cercar las albercas. PROBLEMA 2 Escribe las clases que se mencionan más abajo. Luego ejecuta tu programa y asegúrate que genera resultados correctos. Clase “Cuadrado” tal como se indica en el diagrama UML: Cuadrado
  • lado: double
  • Cuadrado()
  • Cuadrado(double)
  • setLado(double): void
  • getLado(): double
  • equals(Object): boolean
  • toString(): String
  • calculaArea(): double
  • calculaPerimetro(): double

Clase “Restaurante” que tiene como atributos el nombre del restaurante y el tamaño de las numMesas mesas (1≤ numMesas ≤ 25) que tiene disponible. Todas las mesas son cuadradas. Decide qué métodos incluir en esta clase, si el comportamiento esperado es el siguiente:

  1. Calcular y regresar el total de metros de tela que se necesita para fabricar manteles para todas las mesas.
  2. Calcular y regresar el total de metros lineales requeridos de puntilla para poner en todos los extremos de los lados de los manteles. PROBLEMA 3 Escribe las clases que se mencionan más abajo. Luego ejecuta tu programa y asegúrate que genera resultados correctos. Clase “Alumno” tal como se indica en el diagrama UML. Si lo necesitas puedes agregar otros atributos y/o métodos.

Alumno

  • serie: int = 100
  • claveUnica: int
  • nombreAlum: String
  • califMateriasAprob: double[]
  • totalCalif: int
  • MAX_CALIF = 50
  • Alumno(String)
  • altaCalificación(double): boolean
  • getNombreAlum(): String
  • equals(Object): boolean
  • toString(): String
  • calculaPromedio(): double Clase “Escuela” que tiene un nombre, una dirección y numAlumnos alumnos (1≤ numAlumnos ≤ 50). La escuela debe tener los métodos necesarios para que pueda mostrar el siguiente comportamiento:
  1. Dada la clave de un alumno regresar, en forma de cadena todos los datos del alumno correspondiente. Considera todos los casos que puedan presentarse.
  2. Regresar el nombre y promedio de todos los alumnos.
  3. Regresar el nombre del alumno que tenga el mayor número de materias aprobadas. Considera que sólo hay un alumno que cumple con esta condición.
  4. Retoma el inciso anterior y considera que puede haber más de un alumno que cumpla con la condición. Dada la restricción de que NO debe regresar una cadena con los nombres, decide qué tipo de resultado será el más adecuado para el método. PROBLEMA 4 Considera el diagrama de clases que aparece más abajo (puedes agregar atributos y/o métodos si lo crees conveniente). Lee cuidadosamente toda la información que se proporciona. Analiza el problema y plantea la mejor solución. Prueba tu programa.  El salario de un empleado, en general, se calcula como sueldo base + un % de prestaciones ( prestac ) – un % deducciones ( deduc ).

 Preparatoria: comprende los 3 años de preparatoria. De cada alumno se conoce:

1. Kinder: Nombre completo CURP Fecha de nacimiento: mes/día/año Nombre completo de la madre Nombre completo del padre Nombre completo del tutor (este dato puede estar vacío si el alumno tiene a uno o a ambos padres). Nivel: maternal, kinder I, kinder II o preescolar 2. Primaria: Nombre completo CURP Fecha de nacimiento: mes/día/año Nombre completo de la madre Nombre completo del padre Nombre completo del tutor (este dato puede estar vacío si el alumno tiene a uno o a ambos padres). Escuela de procedencia Promedio año anterior Grado que cursa: primero, segundo, …, sexto Calificaciones de los 5 bimestres del año que cursa (puede que no esté completo, dependiendo de la fecha) 3. Secundaria: Nombre completo CURP Fecha de nacimiento: mes/día/año Nombre completo de la madre Nombre completo del padre Nombre completo del tutor (este dato puede estar vacío si el alumno tiene a uno o a ambos padres). Escuela de procedencia Promedio año anterior Grado que cursa: primero, segundo, tercero Calificaciones de los 5 bimestres del año que cursa (puede que no esté completo, dependiendo de la fecha) Actividad artística/deportiva que practica como parte de su carga escolar 4. Preparatoria: Nombre completo CURP Fecha de nacimiento: mes/día/año Nombre completo de la madre Nombre completo del padre Nombre completo del tutor (este dato puede estar vacío si el alumno tiene a uno o a ambos padres). Escuela de procedencia Promedio año anterior Grado que cursa: primero, segundo, tercero

Calificaciones de los 5 bimestres del año que cursa (puede que no esté completo, dependiendo de la fecha) Área de especialización (asumiendo que se elige al empezar el primer año de preparatoria) Actividades:

  1. Analiza la información proporcionada y define las clases necesarias para representar el conocimiento disponible sobre los alumnos. 2) Establece relaciones entre las clases generando un diagrama de clases UML. El diagrama debe reflejar los conceptos (distintos niveles académicos de los alumnos) así como la relación entre dichos conceptos. PROBLEMA 6 Lee cuidadosamente la información que se proporciona. Analiza el problema y plantea la mejor solución. Prueba tu programa. Empleado
  • serie: int = 100
  • claveEmpleado: int
  • nombreEmpleado: String

sueldoBase: double

Empleado()

Empleado(String, double)

  • getSueldoBase(): double
  • getNombreEmpleado(): String
  • toString(): String
  • equals(Object): boolean
  • calculaSalario (double prestac, double deduc): double Administrativo
  • departamento: String
  • teléfono: String
  • Administrativo()
  • Administrativo(String, double, String, String)
  • toString(): String Operario
  • horasExtras: int
  • Operario()
  • Operario(String, double, int)
  • toString(): String
  • calculaSalario(double prestac, double deduc, double precioHE): double Nota: El nombre de la clase y del método en itálica indica que son abstractos.  El salario de un administrativo se calcula como sueldo base + un % de prestaciones (prestac) – un % deducciones (deduc).  El salario de un operario se calcula como sueldo base + un % de prestaciones (prestac) + las horas extras trabajadas * el precio de cada hora – un % deducciones (deduc). Se tiene además la clase “Empresa” que tiene como atributos el nombre de la empresa, la dirección, el nombre del dueño, los datos de todos sus empleados administrativos y los datos de

b) Permita conocer, dada la clave de un pájaro y si fue almacenado, todos los datos de dicho pájaro. En caso contrario desplegar un mensaje adecuado. c) Dada la clave de un avión, imprimir cuántos pasajeros puede transportar, siempre que el avión sea de pasajeros y se encuentre almacenado en el arreglo. En otro caso dar un mensaje. d) Actualizar el hábitat de un pájaro. Decide qué datos necesitas. PROBLEMA 8 Analiza el siguiente diagrama de clases. Posteriormente:

  1. Define todas las clases/interfaces representadas en el esquema que aparece más abajo.
  2. Decide qué atributos y métodos deben incluirse para lograr una definición adecuada de los correspondientes conceptos. PROBLEMA 9 Retoma el problema 8. Desarrolla una aplicación que, contando con un arreglo polimórfico de tipo FigGeométrica , pueda realizar las actividades que se describen a continuación.
  3. Dar de alta figuras geométricas.
  4. Generar y regresar una cadena con el área y el tipo (triángulo, cuadrado, etc.) de cada una de las figuras almacenadas.
  5. Encontrar y regresar los datos del círculo más grande.
  6. Calcular e imprimir el total de un tipo de figura geométrica. El tipo que interesa se proporciona por medio de un parámetro tipo cadena.
  7. Eliminar todos los triángulos equiláteros. El método regresa el total de triángulo eliminados. PROBLEMA 10

Una empresa minera tiene camiones de volteo, que utiliza para el movimiento y traslado de tierra, y camiones de pasajeros para transportar a su personal. El esquema de clases que aparece más abajo corresponde a como se han modelado los datos. Puedes agregar atributos y/o métodos si lo crees conveniente. En la clase EmpresaMinera puedes agregar otros atributos y debes definir los métodos necesarios para que se pueda realizar lo que se describe a continuación:

  1. Regresar en forma de cadena todos los datos de los camiones de pasajeros.
  2. Dada la placa de un camión de volteo, actualizar su capacidad de transporte (la nueva capacidad se recibe como parámetro).
  3. Calcular y regresar el total de camiones de pasajeros que sean de una cierta marca (la marca se recibe como parámetro).
  4. Calcular y regresar el total de toneladas de tierra que puede ser transportado simultáneamente.
  5. Utiliza un archivo de objetos para guardar toda la información de la empresa minera. Hacer un main (o usar pruebas unitarias) para probar tu solución.

Camion

  • marca: String
  • numMotor: String
  • placas: String
  • Camión()
  • Camión(String, String, String)
  • toString(): String
  • equals(Object): boolean

DePasajeros

  • totalPasaj: int
  • DePasajeros()
  • DePasajeros(String, String, String, int)
  • toString(): String

DeVolteo

  • capacidadTon: double
  • DeVolteo()
  • DeVolteo(String, String, String, double)
  • toString(): String

EmpresaMinera

  • nombreEmpresa: String
  • camiones: Camión[]
  • totalCam: int
  • EmpresaMinera() PROBLEMA 11

Camión

  • marca: String
  • numMotor: String
  • placas: String
  • costoCamión: double
  • Camión()
  • Camión(String, String, String, double)
  • toString(): String
  • equals(Object): boolean DePasajeros
  • totalPasaj: int
  • DePasajeros()
  • DePasajeros(String, String, String, double,int)
  • toString(): String
  • calculaCostoServicio(double): double Turismo
  • asientoCama: boolean
  • serviBar: boolean
  • Turismo()
  • Turismo(String, String, String, double, int, boolean, boolean)
  • toString(): String
  • calculaCostoServicio(double): double Escolar
  • lugarProyecto: boolean
  • Escolar()
  • Escolar(String, String, String, double, int, boolean)
  • calculaCostoServicio(): double

Estructura de datos Pila: definición de la clase Pila y su uso en la solución de

problemas.

PROBLEMA 12

Lee cuidadosamente la información que se presenta más abajo. Analiza el problema y plantea la mejor solución. Prueba tu solución. Se requiere de un programa que sea capaz de analizar una cadena (un dato tipo String ) para determinar si los paréntesis (izquierdos y derechos) están balanceados. En tu solución debes tener:  Interface Pila: según lo estudiado en clase.  Clase PilaArreglo: según lo estudiado en clase.  Clase RevisorParentesis: cuyo atributo es la cadena que se quiere analizar. Además, debe contar con un método que realice el análisis de esta (con la ayuda de un objeto tipo Pila) y regrese verdadero si se cumple la condición establecida o falso en caso contrario. PROBLEMA 13 Lee cuidadosamente la información que se presenta más abajo. Analiza el problema y plantea la mejor solución. Prueba tu solución. Se requiere de un programa que sea capaz de invertir el orden de los caracteres que forman una cadena (un dato tipo String ). En tu solución debes tener:  Interface Pila: según lo estudiado en clase.  Clase PilaArreglo: según lo estudiado en clase.  Clase InvierteCad: cuyos atributos son la cadenaInicial (la cual se quiere invertir) y la cadenaInvertida (resultado de la inversión). Además, debe contar con un método que realice la inversión (con la ayuda de un objeto tipo pila) de la cadenaInicial y la deje en cadenaInvertida. PROBLEMA 14 Escribe un método estático no destructivo^1 que reciba un objeto tipo pila genérica y que regrese el número de elementos que tiene almacenados. INDICA claramente de qué tipo son los datos que utilizas en tu solución. Prueba tu solución. PROBLEMA 15 Escribe un método estático no destructivo que reciba 2 pilas genéricas y regrese true si la primera de ellas “contiene” a la segunda. Una pila p1 contiene a una pila p2 si todos los elementos de p2 están también en p1. Puedes suponer que en las pilas no hay elementos repetidos. Prueba tu solución. (^1) Método no destructivo: el dato de entrada NO puede modificarse, es decir, terminado el método debe quedar como se recibió.

PROBLEMA 22^3

Es posible usar un arreglo unidimensional para almacenar dos pilas: una a partir de la

posición 0 y la otra a partir de la última posición. Modifica la interface PilaADT y la

clase PilaArreglo para ajustarlas a las nuevas especificaciones. Decide de qué manera se

indicará a qué pila afectarán las operaciones. Considera todos los casos que puedan

presentarse.

PROBLEMA 23

Escribe una subclase de la clase PilaArreglo tal que, además de la funcionalidad

establecida inicialmente en la interface, tenga una función que regrese el máximo valor

almacenado. Puedes suponer que en la pila NO se guardan elementos repetidos. Analiza

tu solución: ¿se comporta correctamente en todos los casos? ¿hay algún caso en el cual

la solución resulte más o menos eficiente?

(^3) Tomado de: ftp://www.cc.uah.es/pub/Alumnos/G_Ing_Informatica/Data_Structures/Exercises/ExT1_StacksQueues.pd f

Estructura de datos Conjunto: definición de la clase Conjunto y su uso en la

solución de problemas.

PROBLEMA 24

Según lo visto en clase, define una interface ConjuntoADT en la que establezcas el comportamiento esperado de un conjunto. Posteriormente escribe la clase Conjunto con los atributos que lo caracterizan y los métodos que implementen las operaciones establecidas en la interface (agregar un elemento, quitar un elemento, conjunto vacío, cardinalidad, etc.). Prueba tu clase desarrollando una pequeña aplicación o usando pruebas unitarias. PROBLEMA 25 En la clase hecha en el ejercicio anterior agrega métodos para implementar las siguientes operaciones:

  1. Unión de conjuntos.
  2. Intersección de conjuntos.
  3. Diferencia de conjuntos. PROBLEMA 26

Se realizó una encuesta entre alumnos del ITAM para conocer qué idiomas extranjeros

dominan. De acuerdo a las respuestas dadas se agruparon a los alumnos en tres grupos,

los que dominan inglés, francés u otro (alemán, chino, italiano, etc.), guardando sus

nombres en 3 conjuntos. Escribe métodos estáticos para: 1) Generar una cadena con los

nombres de todos los alumnos que dominan inglés y francés , 2 ) Obtener el total de

alumnos que sólo dominan inglés, y 3) Generar una cadena con los nombres de los

alumnos que dominan, al menos, 3 idiomas.

Escribe una clase con un método main. En la clase debes incluir los métodos estáticos

descritos más arriba y, además, debes incluir un método estático para leer los datos de

un archivo de texto e ir guardándolos en los conjuntos. La información se proporciona

de la siguiente manera:

idioma, nombre

Notas:

 Los idiomas y los nombres se proporcionan sin acentos.

 Se puede suponer que el nombre de los alumnos está bien escrito y que se capturó

de la misma manera, esto último es determinante para alumnos que dominan dos

o más idiomas. Por ejemplo, si se omitió el segundo apellido con el primer

idioma, entonces también se omitió dicho apellido con el segundo idioma.

 Los nombres deben pasarse a mayúsculas al ser almacenados en los conjuntos.

Recursión: desarrollo de algoritmos recursivos. Recuerda que algunos de los

problemas que debes resolver usando recursión pueden ser resueltos iterativamente de

manera más eficiente, considerando el costo de recursos computacionales y la

complejidad del código. Sin embargo, por su simplicidad son útiles para reforzar este

nuevo concepto.

PROBLEMA 28

Escribe un método estático que reciba un arreglo de enteros y regrese la suma de sus componentes. Debes usar recursión. Prueba tu solución. PROBLEMA 29 Escribe un método estático ( void ) que reciba un arreglo de enteros e imprima cada uno de sus componentes: a) de izquierda a derecha y b) de derecha a izquierda. Debes usar recursión. Prueba tu solución. PROBLEMA 30 Define la clase ArregloGenérico en la cual escribas los métodos que se mencionan más abajo de manera recursiva. Analiza tus soluciones con respecto a las correspondientes implementaciones iterativas.

  1. Búsqueda secuencial: recibe un dato tipo T y regresa la posición en la que está o un - 1 si no está.
  2. Búsqueda binaria: recibe un dato tipo T y regresa la posición en la que está o el negativo de la posición + 1 en la que debería estar.
  3. Método toString( ): regresa el contenido del arreglo en forma de cadena.
  4. Método que encuentre y regrese la posición del mayor de los elementos del arreglo.
  5. Método que elimine todas las ocurrencias de un cierto objeto en el arreglo. Decide qué parámetros se necesitan y qué tipo de resultado da el método.
  6. Método equals (Object obj): determina si dos arreglos son iguales.
  7. Método de ordenación por selección directa.
  8. Escribe una pequeña aplicación para probar tus métodos. PROBLEMA 31 Retoma la clase ConjuntoA y rescribe los métodos (cuando aplique) de manera recursiva. PROBLEMA 32 Define la clase OperacionesArregloBidimensional en la cual escribas los métodos estáticos que se mencionan más abajo de manera recursiva. Decide, en cada caso, los parámetros que se necesitan y el tipo de resultado que arrojan. Analiza tus soluciones con respecto a las correspondientes implementaciones iterativas.
  1. sumaUnRenglon: suma el contenido de un renglón del arreglo bidimensional, regresando la suma obtenida.
  2. sumaPorColumna: suma por columna todos los elementos del arreglo bidimensional, regresando la suma obtenida.
  3. toString(): regresa el contenido del arreglo en forma de cadena, organizado por renglón.
  4. sumaDiagonalPrincipal: suma y regresa los elementos de la diagonal principal.
  5. sumaMatrices: suma dos matrices y regresa la matriz resultado.
  6. multiplicaMatrices: multiplica dos matrices y regresa la matriz resultado. PROBLEMA 33 Escribe un método estático que reciba una cadena que almacena el nombre de un archivo de texto y cuente y regrese el total de palabras almacenadas en dicho archivo. Prueba tu solución.  Debes usar recursión.  Puedes suponer que las palabras están separadas por un espacio en blanco. PROBLEMA 34 Escribe un método estático recursivo que reciba un arreglo genérico y que invierta el contenido de este. Es decir, el primer elemento pasará a ser el último, el segundo el penúltimo y así hasta el final. El método debe modificar el arreglo recibido, NO generar un nuevo arreglo. Prueba tu solución.