2. Estructuras de Datos en C++Juan Carlos Diazjcdiaz@cable.net.co MetodologíaUsted deberá leer el presente documento e ir corriendo los programas en C++, cuidando de leer bien las instrucciones y tratar de entenderlas por completo. Está escrito de una forma escalonada para que alcance el conocimiento de C++ y programación por objetos de forma progresiva. Se recomiendo leerlo con cuidado, porque aunque no es demasiado extenso si contiene mucha información que usted debe ir asimilando. Si va muy rápido llegará un punto en que no entenderá.Resuelva los ejercicios y preséntelos
al profesor.
Ejercicio para Resolver No. 1Cree una clase que implemente el ejercicio de las palabras homónimas en una clase pero además que sea insensible a mayúsculas, minúsculas y tildes.Principales estructuras de datos en C y C++Las principales estructuras de datos que son la lista, la pila, la cola y el árbol pueden ser implementados en C++, y darles una modularidad que con lenguaje C no era posible.Para definir una estructura de datos normalmente se crea un objeto que maneja la cabeza de la estructura y a través de los métodos miembro se realizan las funciones propias de un TAD. La estructura más sencilla es una pila, vamos a crear una pila que maneje valores enteros. Esta estructura puede implementarse de dos maneras, una es usando un vector otra usando nodos unidos a través de apuntadores. Vamos a realizar primero una pila hecha
con un arreglo estático (sin apuntadores) y luego un ejemplo con
apuntadores.
Uso de Clases con Arreglos
prog1 #include "iostream.h" class Vector {
Vector::Vector() {
void Vector::mostrarVector() {
main() {
Se puede observar que el manejo desde el main se hace mucho más sencillo. Se crea la variable que en este caso se llama mivector y luego se usan sus métodos de entrarDato, verDato y mostrarVector, de manera muy sencilla.
Ejercicio Resuelto AHaga una clase que contenga un vector de 10, que contenga los factoriales de los primeros 10 números. Estos valores deben ser calculados y guardados en el constructor de la clase y luego para consulta no se deben calcular sino leer del vector interno. Si el usuario da un número mayor a 9 se le informará que no es posible hacer su operación.Elabore la clase y el programa que permita probar su funcionamiento. Soluciónprog2#include "iostream.h" class Factorial {
Factorial::Factorial() {
main () {
Pila con Arreglo de enterosVamos a crear una clase llamada Pila que manejará una estructura de este tipo a través de una clase. La definición inicial será así:#include "iostream.h" class Pila {
Pero en este caso al crear este objeto no hace nada porque el constructor está vacío y no hay forma de llegar a su vector interno. Las estructuras tienen funciones que se agrupan funcionalmente de la siguiente forma.
Es necesario recordar que en la pila el dato que sale fue el último que se metio en la estructura. Para la pila se usará un vector estático de 50 posiciones y un índice que se encargará de indicar donde está la cabeza de la pila. Cuando indicePila sea -1, la pila estará vacía. Cuando sea 0, indicará que en la pila hay un dato en la posición 0, y así sucesivamente. La clase que podrá manejar la estructura de pila es la siguiente: prog3 #include "iostream.h" // Pila hecha con un vector fijo de 50 posiciones
// Esta función sale del cuerpo de la clase porque
usa un ciclo.
int Pila::cuantosDatos() {
void Pila::entrarDato(int dato) {
int Pila::sacarDato() {
Hay que notar que todas las funciones con excepción del constructor se sacaron del cuerpo de la clase y su nombre se resolvió usando los dos pares de dos puntos ::. Esto permite implementar una función miembro por fuera del cuerpo de la clase. De esta forma por ejemplo, la función que dentro del cuerpo de la clase se llama: void entrarDato(int dato); Afuera del cuerpo de la clase se llama void Pila::entrarDato(int dato) { Esa es la misma función solo que el primero es el prototipo que se le pasa a la clase para que sepa que hay una función con ese nombre que será implementada más adelante. Ahora hace falta un cuerpo del programa o main que sepa como manejar esta estructura. Para eso implementaremos una función menú que se encargará de pedir al usuario que indique cual función desea ejecutar, usando una estructura while. Se ha creado una función adicional que maneja el menú: prog3 (2a parte) int menu() {
main () {
El programa completo será obviamente la parte que define e implementa la clase con la segunda que usa la función menú y el main. El switch es usado para atender cada una de las opciones que son ofrecidas al usuario en el menú. Estudie el anterior programa hasta entenderlo
completamente.
Ejercicio para Resolver No. 2Hacer una versión de prog3 en el cual se use un apuntador a un vector de enteros, es decir que la declaración de vector no seaint vector [50]; Sino que sea int *vector; Modifique el programa para que al entrar pida el tamaño de la pila que el usuario desea. Es decir, ya no será de 50 posiciones fijas sino del tamaño que el usuario escoja al inicio del programa
Pila con apuntadoresEl programa anterior se puede modificar para que maneje una lista enlazada. En el caso actual usaremos una lista doblemente enlazada que se comporta como una pila.Tendremos una lista que usa dos apuntadores iniciales que son inicio y final que manejarán la lista enlazada y permitirán tener una pila implementada con apuntadores. Este programa desde el punto de vista del usuario es completamente igual al anterior. Sin embargo, no tiene la restricción de las 50 posiciones. prog3 #include "iostream.h" struct nodo {
// Pila hecha con apuntadores
// Esta función sale del cuerpo de la clase porque
usa un ciclo.
int Pila::cuantosDatos() {
void Pila::entrarDato(int dato) {
int Pila::sacarDato() {
Pila::~Pila() {
int menu() {
main () {
Ejercicio para Resolver No. 3Cree una clase que contenga una estructura (vector o apuntador) a la cual se le puedan entrar 30 valores enteros. Estos enteros entrarán en desorden pero siempre que se le solicite listar los valores estos deberán salir ordenados de menor a mayor.
|