Documentos de Académico
Documentos de Profesional
Documentos de Cultura
FUNDAMENTOS DE
ALGORITMOS, ESTRUCTURA
DE DATOS Y OBJETOS
Quinta edición
Quinta edición
Esta publicación no puede ser reproducida ni en todo ni en parte, ni registrada en/o trasmitida por un sistema de
recuperación de información, en ninguna forma ni por ningún medio, sea mecánico, fotocopiado, electrónico, ni
magnético, electroóptico o cualquier otro tipo, sin el permiso previo y por escrito de la editorial.
Fundamentos de programación
Algoritmos, estructura de datos y objetos
Quinta edición
Capítulo 12 Estructuras dinámicas lineales de datos (pilas, colas y listas enlazadas) ........................................................... 439
INTRODUCCIÓN ........................................................................................................................................................... 439
12.1. Introducción a las estructuras de datos........................................................................................................................ 440
12.1.1. Estructuras dinámicas de datos ............................................................................................................ 440
12.2. Listas ................................................................................................................................................................. 441
12.3. Listas enlazadas ................................................................................................................................................. 443
12.4. Procesamiento de listas enlazadas ..................................................................................................................... 446
12.4.1. Implementación de listas enlazadas con punteros ............................................................................... 446
12.4.2. Implementación de listas enlazadas con arrays (arreglos) .................................................................... 453
XIV Contenido
Capítulo 15 Tipos abstractos de datos, objetos y modelado con UML 2.5.1 ......................................................................... 567
INTRODUCCIÓN ........................................................................................................................................................... 567
15.1. Programación estructurada (procedimental) ........................................................................................................ 568
15.1.1. Limitaciones de la programación estructurada..................................................................................... 568
15.1.2. Modelado de objetos del mundo real: el camino a los objetos ............................................................. 569
15.2. Programación orientada a objetos ..................................................................................................................... 570
15.2.1. Objetos ................................................................................................................................................. 571
15.2.2. Tipos abstractos de datos: CLASES ...................................................................................................... 572
15.3. Modelado e identificación de objetos ................................................................................................................ 574
15.4. Propiedades fundamentales de orientación a objetos ........................................................................................ 575
15.4.1. Abstracción .......................................................................................................................................... 575
15.4.2. La abstracción en el software ................................................................................................................ 576
15.4.3. Encapsulamiento y ocultación de datos................................................................................................ 576
15.4.4. Herencia ............................................................................................................................................... 577
15.4.5. Reutilización o reusabilidad ................................................................................................................... 578
15.4.6. Polimorfismo ........................................................................................................................................ 578
15.5. Modelado de aplicaciones: UML........................................................................................................................ 579
15.5.1. Lenguaje de modelado ......................................................................................................................... 580
15.5.2. UML: el Lenguaje Unificado de Modelado ........................................................................................... 581
15.6. Modelado y modelos.......................................................................................................................................... 581
15.7. Diagramas de UML 2.5.1 ................................................................................................................................... 583
15.8. Bloques de construcción (componentes) de UML 2.5.1 ..................................................................................... 586
15.8.1. Elementos estructurales ....................................................................................................................... 586
15.8.2. Elementos de comportamiento............................................................................................................. 587
15.8.3. Elementos de agrupación ..................................................................................................................... 588
15.9. Especificaciones de UML ................................................................................................................................... 588
15.10. Historia de UML ................................................................................................................................................. 589
CONCEPTOS CLAVE ..................................................................................................................................................... 590
RESUMEN ...................................................................................................................................................................... 590
ANEXO: TERMINOLOGÍA DE ORIENTACIÓN A OBJETOS........................................................................................... 591
EJERCICIOS ................................................................................................................................................................... 591
Capítulo 17 Relaciones entre clases: delegaciones, asociaciones, agregaciones, herencia .................................................... 633
INTRODUCCIÓN ........................................................................................................................................................... 633
17.1. Relaciones entre clases ...................................................................................................................................... 634
17.2. Dependencia...................................................................................................................................................... 635
17.3. Asociación ......................................................................................................................................................... 635
17.3.1. Multiplicidad ........................................................................................................................................ 637
17.3.2. Restricciones en asociaciones ............................................................................................................... 638
17.3.3. Asociación cualificada .......................................................................................................................... 639
17.3.4. Asociaciones reflexivas......................................................................................................................... 639
17.3.5. Diagrama de objetos............................................................................................................................. 639
17.3.6. Clases de asociación ............................................................................................................................. 640
17.3.7. Restricciones en asociaciones ............................................................................................................... 644
17.4. Agregación ........................................................................................................................................................ 645
17.4.1. Composición ........................................................................................................................................ 647
17.5. Jerarquía de clases: generalización y especialización ......................................................................................... 648
17.5.1. Jerarquías de generalización/especialización ........................................................................................ 650
17.6. Herencia: clases derivadas ................................................................................................................................. 653
17.6.1. Herencia simple ................................................................................................................................... 654
17.6.2. Herencia múltiple................................................................................................................................. 654
17.6.3. Niveles de herencia .............................................................................................................................. 655
17.6.4. Declaración de una clase derivada ....................................................................................................... 658
17.6.5. Consideraciones de diseño ................................................................................................................... 658
17.7. Accesibilidad y visibilidad en herencia .............................................................................................................. 659
17.7.1. Herencia pública .................................................................................................................................. 659
17.7.2. Herencia privada .................................................................................................................................. 660
17.7.3. Herencia protegida ............................................................................................................................... 660
17.8. Un caso de estudio especial: herencia múltiple ................................................................................................ 661
17.8.1. Características de la herencia múltiple ................................................................................................. 663
17.9. Clases abstractas ................................................................................................................................................ 665
17.9.1. Operaciones abstractas ......................................................................................................................... 666
CONCEPTOS CLAVE ..................................................................................................................................................... 667
RESUMEN ...................................................................................................................................................................... 667
EJERCICIOS ................................................................................................................................................................... 667
Contenido XVII
Desde 2008, año de la publicación de la cuarta edición de esta obra, mucho ha cambiado el mundo en general y el
mundo de la programación en particular. Numerosas tecnologías de la información y las comunicaciones (TIC) se
han consolidado y, sobre todo, numerosas tecnologías disruptivas han aparecido. De igual forma se han consolida-
do nuevas tendencias tecnológicas como el caso de la Industria 4.0 y la Cuarta Revolución Industrial, que han
traído consigo el asentamiento y despliegue de innumerables tendencias tecnológicas como Inteligencia Artificial, Big
Data, Cloud Computing, Internet de las Cosas, Blockchain, Computación Cuántica, Redes Celulares –especialmente redes 4G
y la naciente 5G–, Ciberseguridad… unidas al despegue creciente de un nuevo mundo ubicuo, donde todas las cosas
serán inteligentes, se podrán conectar entre sí, y se podrán conectar a Internet en cualquier lugar, en cualquier momento y
con cualquier dispositivo.
Todas las ediciones de esta obra, y naturalmente esta quinta edición, se han apoyado en las directrices reco-
mendadas por las organizaciones nacionales e internacionales de España, Latinoamérica, el Caribe, y Portugal y
Brasil –países donde prolifera el estudio del lenguaje español y donde algunos de nuestros libros han sido traducidos
al idioma portugués.
Computing Curricula
Como norma general, siempre se han tratado de seguir también las directrices de las organizaciones internaciona-
les de computación (computer science) y en particular, la ACM (The Association for Computing Machinery), y la
IEEE-CS (The Computer Society). Las recomendaciones para el estudio de carreras relacionadas con Computer Scien-
ce, han constituido y constituyen la referencia obligada en casi todos los países de lengua española y, naturalmente,
de lengua inglesa. Las cuatro primeras ediciones trataron de adaptarse a las directrices curriculares de la ACM/IEEE
conocidas como Computing Curricula, tomando como base las últimas publicadas esencialmente, Computing Curricu-
la 1991 o CC1991 y Computing Curricula 2001 o CC2001. Sin embargo, es el informe Computing Curricula 20051
publicado en 2006, el que contempla la actualización que hoy día sigue la mayoría de las universidades, institutos
tecnológicos, centros de formación, ya que propone no una única disciplina de computer science sino cinco discipli-
nas o subdisciplinas y que de una u otra forma están adoptando todas las organizaciones académicas y profesiona-
les: Ingeniería de Computadores (Computer Engineering, CE), presta la atención en los dispositivos de hardware;
Ingeniería del Software (Software Engineering, SE), el énfasis está en la creación de software que satisfaga las ro-
bustas necesidades del mundo real y Ciencias de la Computación (Computer Science, CS), y con el enfoque del
software como “lenguaje” con el que se expresan las ideas y se explora una amplia gama de problemas de compu-
tación y aplicaciones, las disciplinas de Tecnologías de la Información (Information Technologies, IT) y Sistemas de
Información (Information Systems, IS)
1
Computing Curricula 2005 (CC2005). The Overview Report covering undergraduate degree programs in: Computer Engineering, Computer
Science, Information Systems, Information Technology, Software Engineering. https://www.acm.org/binaries/content/assets/education/curricu-
la-recommendations/cc2005-march06final.pdf
XX Prólogo a la quinta edición
Las cinco carreras citadas anteriormente tienen como primera asignatura recomendada en todas ellas la asig-
natura Programming Fundamentals.2 Los planes de estudios de ingeniería informática en España3 (grado en inge-
niería informática) y de otras ingenierías (telecomunicaciones, industriales, etcétera) y de ingeniería de sistemas en
Latinoamérica, incluyen asignaturas tales como Fundamentos de Programación, o nombres similares como Meto-
dología de la Programación, Introducción a la Programación o Programación de computadoras.
La ACM/IEEE-CS está trabajando en la actualidad para publicar el siguiente Computing Curricula 2020 (CC2020)4
que englobará las cinco disciplinas anteriores y una sexta centrada en Ciberseguridad, aunque durante estos últimos
años ha publicado la mayoría de las nuevas directrices propuestas en CC 2005:5
• CC2005 – Computing Curricula
• SE2014 – Software Engineering
• CS2013 – Computer Science
• CE2016 – Computer Engineering
• IT2017 – Information Technology
• CSEC2017 – Cybersecurity
Computer Society está realizando un nuevo proyecto curricular sobre Data Science (Ciencia de Datos) en CC2020.6 La
informática y las ciencias de la computación en los primeros años del siglo XXI vienen marcadas por los avances
tecnológicos de la década pasada. Los más de veinte años de vida de la computadora personal (PC) y los más de
cincuenta años de la informática/computación tradicional vienen acompañados de cambios rápidos y evolutivos en
las disciplinas clásicas. El rápido crecimiento del mundo de las redes y, en consecuencia, la World Wide Web hacen
revolucionarios a estos cambios y afectan al cuerpo de conocimiento de los procesos educativos y profesionales.
Del estudio comparado de las citadas recomendaciones curriculares, así como de planes de estudios conocidos
de carreras de ingeniería de sistemas y licenciaturas en informática de universidades latinoamericanas, hemos lle-
gado a la consideración de que la iniciación de un estudiante de ingeniería informática o de ingeniería de sistemas
en las técnicas de programación actuales y futuros requieren no sólo del aprendizaje clásico del diseño de algoritmos y
de la comprensión de las técnicas orientadas a objetos, sino de un método de transición hacia las tecnologías
predominantes en el horizonte 2020 y las tecnologías disruptivas de la Industria 4.0 y la Cuarta Revolución Indus-
trial. Por otra parte, un libro dirigido a los primeros cursos de introducción a la programación exige no sólo la
elección de un lenguaje de programación adecuado, sino, y sobre todo, «proporcionar al lector las herramientas
para desarrollar programas correctos, eficientes, bien estructurados y con estilo, que sirvan de base para la cons-
trucción de unos fundamentos teóricos y prácticos que le permitan continuar estudiando con éxito los cursos supe-
riores de su carrera, así como una futura especialización en ciencias e ingeniería». En consecuencia y de modo
global, la obra pretende enseñar técnicas de análisis, diseño y construcción de algoritmos, estructuras de datos y
objetos, así como reglas para la escritura de programas, eficientes tanto estructurados, fundamentalmente, como
orientados a objetos. De modo complementario, y no por ello menos importante, se busca también enseñar al
alumno técnicas de abstracción que le permitan resolver los problemas de programación del modo más sencillo y
racional pensando no sólo en el aprendizaje de reglas de sintaxis y construcción de programas, sino, y sobre todo,
aprender a pensar para conseguir la resolución del problema en cuestión de forma clara, eficaz y fácil de implemen-
tar en un lenguaje de programación y su ejecución posterior en una computadora u ordenador.
2
Table 3.1: Comparative weight of computing topics across the five kinds of degree programs.
3
El profesor de la Universidad de Salamanca F. J. García-Peñalvo es autor de un informe muy completo y de gran calidad sobre: Los estudios
de Ingeniería en Informática un Proyecto Docente e Investigador. Salamanca, España: Departamento de Informática y Automática. Universidad de
Salamanca, 2018. https://repositorio.grial.eu › bitstream › grial › ProyectoDocenteInvestigador.
4
https://www.computer.org/volunteering/boards-and-committees/professional-educational-activities/curricula.
5
https://www.acm.org/education/curricula-recommendations
6
CC2020-net
Prólogo a la quinta edición XXI
formación profesional, en los que se cursan asignaturas tales como Fundamentos de Programación, Introducción a
la Programación, Metodología de programación y otros términos o acepciones similares como Programación I y II,
Algoritmos y Estructuras de Datos, entre otras.
El contenido ha sido actualizado pero adaptado a los objetivos de las ediciones anteriores: llegar a estudiantes
de programación de computadoras en sus niveles de iniciación y medio, o a nivel superior que deseen consolidar
sus conocimientos con los lenguajes de programación tradicionales C, C++, Java o se están sumergiendo en los
nuevos lenguajes de programación que hoy están llegando a los departamentos de desarrollo de software en orga-
nizaciones y empresas, o en departamentos universitarios y tecnológicos, como Python, R o JavaScript y que también
necesitan afrontar nuevos lenguajes como Swift, Go o Scala.
Los dos primeros aspectos, algoritmos y datos, han permanecido invariables a lo largo de la corta historia de la in-
formática/computación, pero la interrelación entre ellos sí que ha variado y continuará haciéndolo. Esta interrelación
se conoce como paradigma de programación. Sin embargo, el binomio algoritmos-datos ha alcanzado cimas impensables
hace unos años, tales como su aplicación en las técnicas y métodos de Big Data, y en la aplicación de los algoritmos en
las técnicas de aprendizaje automático (machine learning) y aprendizaje profundo (deep learning) dentro de la ciencia de
la Inteligencia Artificial.
En el paradigma de programación procedimental (procedural o por procedimientos) un problema se modela direc-
tamente mediante un conjunto de algoritmos. Por ejemplo, la nómina de una empresa o la gestión de ventas de un
almacén se representan como una serie de funciones que manipulan datos; mismos que se almacenan separada-
mente y se accede a ellos, o bien mediante una posición global o mediante parámetros en los procedimientos. Tres
lenguajes de programación clásicos, Fortran, Pascal y C, han representado el arquetipo de la programación procedi-
mental, también relacionada estrechamente y —normalmente— conocida como programación estructurada. La pro-
gramación con soporte en C y Pascal proporciona el paradigma procedimental tradicional con un énfasis en funciones,
plantillas de funciones y algoritmos genéricos.
En la década de los ochenta, el enfoque del diseño de programas se desplazó desde el paradigma procedimental
al orientado a objetos apoyado en los tipos abstractos de datos (TAD); desde entonces conviven los dos paradigmas.
En el paradigma orientado a objetos un problema se modela en un conjunto de abstracciones de datos (tipos de datos)
conocidos como clases. Las clases contienen un conjunto de instancias o ejemplares de la misma que se denominan
objetos, de modo que un programa actúa como un conjunto de objetos que se relacionan entre sí. La gran diferencia
entre ambos paradigmas reside en el hecho de que los algoritmos asociados con cada clase se conocen como inter-
faz pública de la clase y los datos se almacenan privadamente dentro de cada objeto, de modo que el acceso a los
datos está oculto al programa general y se gestionan a través de la interfaz.
Así pues, en resumen, los objetivos fundamentales de esta obra son: aprendizaje y formación en algoritmos y
programación estructurada, estructuras de datos y programación orientada a objetos. Evidentemente, la mejor forma de
aprender a programar es con la ayuda de un lenguaje de programación. Apoyados en la experiencia de nuestras
XXII Prólogo a la quinta edición
cuatro primeras ediciones y en los resultados conseguidos con nuestros alumnos y lectores, hemos seguido apos-
tando por utilizar un lenguaje algorítmico —pseudolenguaje— que apoyado en un pseudocódigo (seudocódigo) en es-
pañol nos permitiera enseñar al alumno las técnicas y reglas de programación y que su aprendizaje fuese rápido y
gradual. Naturalmente, además del pseudocódigo hemos utilizado las otras herramientas de programación clásicas
y probadas como los diagramas de flujo o los diagramas N-S.
En esta quinta edición hemos seguido utilizando el mismo lenguaje algorítmico al que ya se le añadió las cons-
trucciones y estructuras necesarias para incorporar en sus especificaciones las técnicas orientadas a objetos. Así,
hemos seguido utilizando nuestro lenguaje algorítmico UPSAM inspirado en su origen en los lenguajes estructura-
dos por excelencia, y a los que añadimos en su momento propiedades de los lenguajes orientados a objetos tales
como C++, Python, Java y C#, en la mejor armonía posible y con unas especificaciones que hemos incluido en los
apéndices de la edición en papel y en su sitio web.
destrezas de programación. La adopción de un curso de nivel básico y medio de programación proviene de una
serie de factores prácticos e históricos e incluyen los siguientes temas:
• La programación es una técnica esencial que debe ser dominada por cualquier estudiante de informática, de
computación y de ingeniería de sistemas. Su inserción en los primeros cursos de la carrera asegura que los
estudiantes tengan la facilidad necesaria con la programación para cuando se matriculan en los cursos de nivel
intermedio y avanzado.
• La informática no se convirtió en una disciplina académica hasta después de que la mayoría de las instituciones
ha desarrollado un conjunto de cursos de programación introductoria que sirva a una gran audiencia.
• El modelo de aprendizaje en programación ha seguido las directrices emanadas de los computing curricula de la
ACM/IEE-CS.
• Los programas de informática deben enseñar a los estudiantes cómo utilizar de manera adecuada al menos un
lenguaje de programación. Además, recomendamos que los programas en informática enseñen a los estudian-
tes a ser competentes en lenguajes y que hagan uso de, por lo menos, dos paradigmas de programación. Como
consecuencia de estas ideas, se contempla la necesidad de conceptos y habilidades que son fundamentales en
la práctica de la programación con independencia del paradigma subyacente. Como resultado de este pensa-
miento, el área de Fundamentos de Programación incluye unidades sobre conceptos de programación, estruc-
turas de datos básicas y procesos algorítmicos. Además de estas unidades fundamentales se requieren concep-
tos básicos pertenecientes a otras áreas, como son Lenguajes de Programación (PL, Programming Languages)
y de Ingeniería de Software (SE, Software Engineering).
Los temas fundamentales que se consideraban en el currículo 2001 y han seguido en el de 2005 de la ACM, y se-
guirán en el 2020, son:
• Construcciones fundamentales de programación.
• Algoritmos y resolución de problemas.
• Estructuras de datos fundamentales.
• Recursión o recursividad.
• Programación controlada por eventos.
De otras áreas, Lenguajes de Programación (PL), destacan:
• Revisión de lenguajes de programación.
• Declaraciones y tipos.
• Mecanismos de abstracción.
• Programación orientada a objetos.
Y de Ingeniería de Software (SE):
• Diseño de software.
• Herramientas y entornos de software.
• Requisitos y especificaciones de software.
• Desarrollo de procesos de software.
Este libro se ha escrito pensando en que pudiera servir de referencia y guía de estudio para un primer curso de In-
troducción a la programación, con una segunda parte que, a su vez, sirviera como continuación y para un posible
segundo curso de Estructuras de datos y programación orientada a objetos. El objetivo final que busca es, no sólo descri-
bir la sintaxis de un lenguaje de programación, sino, y sobre todo, mostrar las características más sobresalientes del
lenguaje algorítmico y a la vez enseñar técnicas de programación estructurada y orientada a objetos. Así pues, los
objetivos fundamentales son:
• Énfasis fuerte en el análisis, construcción y diseño de programas.
• Un medio de resolución de problemas mediante técnicas de programación.
• Una introducción a la informática y a las ciencias de la computación usando una herramienta de programación
denominada pseudocódigo.
• Aprendizaje de técnicas de construcción de programas estructurados y una iniciación a los programas orienta-
dos a objetos.
XXIV Prólogo a la quinta edición
Así, se tratará de enseñar las técnicas clásicas y avanzadas de programación estructurada, junto con técnicas orien-
tadas a objetos. La programación orientada a objetos es la panacea universal de un programador del siglo XXI y un
paradigma imprescindible para los programadores y desarrolladores de software que demandan las empresas.
El contenido del libro trata de proporcionar soporte a un año académico completo (dos semestres o cuatrimes-
tres), alrededor de 24 a 32 semanas, dependiendo lógicamente de su calendario y planificación. Los diez primeros
capítulos pueden comprender el primer semestre y los capítulos restantes pueden impartirse en el segundo semes-
tre. Lógicamente la secuencia y planificación real dependerá del profesor que marcará y señalará semana a semana
la progresión que él considere lógica. Si usted es un estudiante autodidacto, su propia progresión vendrá marcada
por las horas que dedique al estudio y al aprendizaje con la computadora, aunque no debe variar mucho del ritmo
citado al principio de este párrafo.
Another report for 1785 gives the state of schools for that date.
[Sidenote: One
There are several schools in the verge of our school the
monthly meeting, kept by members of our property of the
society, one of which belongs to the monthly monthly meeting]
meeting, with several acres of land, whereon Friends are now
building a house for a master, which when completed there
will be a small fund towards schooling poor children.[579]
For the next six years there are but two reports worthy of attention,
which may be briefly summarized in this manner:
1787 [Sidenote: The
state of schools in
1. One school, under the monthly meeting, 1787]
SUMMARY
This chapter considers the establishment of [Sidenote: The
schools in Kennett, New Garden, Goshen, meetings]
Bradford, Uwchlan, London Grove and Sadsbury
monthly meetings.
No early definite reference is made to education, [Sidenote:
though the careful interest in children’s welfare is at Kennett]
all times evident. Not until the “1777 era” do the [Sidenote: A
reports give any considerable information union school
concerning schools. Committees were thereafter reported]
always in attendance upon the problems of the [Sidenote: Rules
schools. In 1781 a “union school” was reported drawn for school,
between Kennett, Bradford and New Garden, property
purchased]
which was afterwards discontinued. In 1785 they
report “several schools,” in partial accord with demands of the yearly
meeting. Land for Kennett school “number one” was purchased in
1792, and rules drawn up for its control. Their scheme for raising
permanent funds was not completed until 1795. Two schools, taught
by members of the society, were under the care of the meeting’s
committee in 1798.
Two schools were reported at New Garden in [Sidenote: Two
1779 and another was at that time proposed. Some schools under
land was conveyed to the meeting in 1785 for the Kennett meeting]
use of a school, and a house built upon it. Another [Sidenote: Two
piece of land was deeded by William Jackson in schools, another
1794 for a similar purpose. Certain stipulations proposed]
were made concerning the school to be established
there. It was found more consistent in summer to employ mistresses
rather than masters.
Though established at a late date, Goshen was [Sidenote:
very active educationally. Land was purchased and Goshen]
a house was being built for a union school between
Goshen, Bradford and Birmingham, in 1779. [Sidenote: schools]
Two