Estructura de Datos 1

72
APUNTES DE ESTRUCTURAS DE DATOS Un enfoque orientado a objetos RODOLFO E. ARANA GONZALES SASCI 01/01/2009

description

Diseño de estructurasa de datos con un enfoque orientado a objetos. Abarca estructuras estáticas y dinámicas.

Transcript of Estructura de Datos 1

  • APUNTES DE ESTRUCTURAS DE DATOS Un enfoque orientado a objetos RODOLFO E. ARANA GONZALES

    SASCI 01/01/2009

  • APUNTES DE ESTRUCTURAS DE DATOS Un enfoque orientado a objetos RODOLFO E. ARANA GONZALES

  • Prefacio

    Este material ha sido escrito en forma paralela al desenvolvimiento de cursos de Estructuras de

    datos dictados en las universidades de Santa Cruz de la Sierra, con el afn de proporcionar al

    estudiante una gua para aprender estructuras de datos en forma prctica. Asimismo, presentar

    y entender ciertos conceptos, que a menudo no se abordan con la claridad necesaria, como ser

    el manejo de punteros. Tambin se mira la temtica de las estructuras de datos desde un

    enfoque orientado a objetos, explicando que esta metodologa es una especie de evolucin

    natural de los tipos abstractos de datos en cuanto a su implementacin.

    Estos apuntes estn dedicados a todos aquellos que estn dispuestos a sacrificar horas de

    descanso o diversin, con el fin de superarse permanentemente, hacerse mejores y hacer un

    mundo mejor.

    El autor

  • Tabla de contenido

    PREFACIO............................................................................................................................................................ 3

    1. ESTRUCTURAS Y ABSTRACCIN DE DATOS ...................................................................................................... 6

    1.1. INTRODUCCIN A LAS ESTRUCTURAS DE DATOS ........................................................................................... 6 1.2. ABSTRACCIN DE DATOS .............................................................................................................................. 6 1.3. CLASIFICACIN DE LAS ESTRUCTURAS DE DATOS ......................................................................................................... 2 1.4. TIPOS ABSTRACTOS DE DATOS............................................................................................................................... 2

    Operaciones con arreglos ................................................................................................................................. 4 1.6 BSQUEDA Y CLASIFICACIN DE ARREGLOS ................................................................................................................ 4

    Bsqueda secuencial ........................................................................................................................................ 5 Bsqueda binaria ............................................................................................................................................. 5 Clasificacin ..................................................................................................................................................... 6 Mtodo de intercambio o de Burbuja ............................................................................................................... 7 Mtodo de la Baraja ........................................................................................................................................ 8 Metodo QuickSort ............................................................................................................................................ 8

    2. ESTRUCTURA DE LENGUAJES DE PROGRAMACIN ORIENTADOS A OBJETO. .................................................... 10

    2.1 . ASPECTOS GENERALES DE LOS LENGUAJES .......................................................................................... 10 2.2 LENGUAJES ORIENTADOS A OBJETO ........................................................................................................................ 12 2.2. ESTRUCTURAS DE DATOS ORIENTADAS A OBJETOS ..................................................................................................... 14 2.4. RECURSIVIDAD Y LENGUAJES DE PROGRAMACIN OO ................................................................................................ 15

    Concepto de Recursividad............................................................................................................................... 15 1. Clculo de la potencia................................................................................................................................. 17 2. La suma de forma recursiva ........................................................................................................................ 18 3. Bsqueda lineal recursiva (con dos casos base) ........................................................................................... 18 4. Bsqueda Binaria recursiva ........................................................................................................................ 18

    3. ALMACENAMIENTO ESTTICO EN SECUENCIA LISTAS .................................................................................... 20

    3.1 ASPECTOS GENERALES DE LISTAS ........................................................................................................................... 20 3.2. PILAS ............................................................................................................................................................ 20

    Aplicacin de pila: Evaluacin de expresiones ................................................................................................. 21 Transformacin de infija a postfija ................................................................................................................. 22

    3.3. COLAS ........................................................................................................................................................... 24 Operaciones Bsicas....................................................................................................................................... 25 Aplicaciones ................................................................................................................................................... 25

    IMPLEMENTACIN DE COLAS EN C++ ........................................................................................................................... 26 Tipos de colas ................................................................................................................................................ 27

    3.4. PROBLEMAS DE APLICACIN DE PILAS, COLAS Y LISTAS................................................................................................ 27

    4. ALMACENAMIENTO DINMICO ........................................................................................................................ 30

    4.1 MANEJO DINMICO DE LA MEMORIA LOS PUNTEROS ............................................................................................... 30 Cmo se almacena una variable? ................................................................................................................. 30 Qu son los punteros? .................................................................................................................................. 32

    4.2. LISTAS ENCADENADAS ....................................................................................................................................... 34 4.3 DISEO E IMPLEMENTACIN DINMICA DE LISTAS ENCADENADAS .................................................................................. 35

    Estructura de Nodo ........................................................................................................................................ 35 Estructura de Lista encadenada ...................................................................................................................... 36 Esquema y diseo de una lista enlazada ......................................................................................................... 36 Operacin de Recorrido .................................................................................................................................. 38

  • Operacin de Insercin ................................................................................................................................... 39 Operacin de Borrado .................................................................................................................................... 40 Operacin de Bsqueda ................................................................................................................................. 40

    4.4. IMPLEMENTACIN DINMICA DE ESTRUCTURAS DE DATOS .......................................................................................... 40 Implementacin de pilas con punteros............................................................................................................ 40

    5. ARBOLES Y GRAFOS ........................................................................................................................................... 41

    55..11 AARRBBOOLLEESS BBIINNAARRIIOOSS ............................................................................................................................................ 41 Definicin de rbol ......................................................................................................................................... 42 Formas de representacin .............................................................................................................................. 42 Declaracin de rbol binario........................................................................................................................... 43 Recorridos sobre rboles binarios ................................................................................................................... 43 Construccin de un rbol binario .................................................................................................................... 45

    55..22 RRBBOOLL BBIINNAARRIIOO DDEE BBSSQQUUEEDDAA ............................................................................................................................. 47 Operaciones bsicas sobre rboles binarios de bsqueda................................................................................ 48 Ejercicio resuelto ............................................................................................................................................ 51 Aplicacin prctica de un rbol binario de bsqueda ...................................................................................... 51 Ejercicios propuestos ...................................................................................................................................... 52

    5.3. RBOLES B ..................................................................................................................................................... 54 Utilizacin de los Arboles B ............................................................................................................................. 54 Funcionamiento ............................................................................................................................................. 55 Qu es un Arbol B? ....................................................................................................................................... 57 Costos ............................................................................................................................................................ 61 Casos especiales............................................................................................................................................. 62 Conclusin ..................................................................................................................................................... 63

    TRABAJOS PRACTICOS ............................................................................................................................... 64 BIBLIOGRAFA .................................................................................................................................................... 67

  • 1. Estructuras y abstraccin de datos

    1.1. Introduccin a las estructuras de datos

    Los programas estn constituidos fundamentalmente por algoritmos y estructuras de datos. Esto

    significa que los algoritmos se ejecutan sobre estas estructuras de datos. Esto permite ver que las

    estructuras de datos son una parte fundamental de la programacin de computadoras, en

    particular; y del procesamiento de informacin, en general

    Una estructura de datos es una coleccin de datos que pueden ser caracterizados por su

    organizacin y las operaciones que se definen sobre ella.

    Se trata de un conjunto de variables de un determinado tipo agrupadas y organizadas de alguna

    manera para representar un comportamiento. Lo que se pretende con las estructuras de datos es

    facilitar un esquema lgico para manipular los datos en funcin del problema que haya que tratar

    y el algoritmo para resolverlo. En algunos casos la dificultad para resolver un problema radica en

    escoger la estructura de datos adecuada. Y, en general, la eleccin del algoritmo y de las

    estructuras de datos que manipular estar muy relacionada.

    1.2. Abstraccin de datos

    El procesamiento de informacin en una computadora requiere hacer una tarea llamada

    abstraccin de datos, que consiste en ver las cosas del mundo real en una forma integral, en el

    sentido de que se ignoran algunas propiedades irrelevantes de los objetos reales, es decir, se

    simplifican. De este modo se hace una seleccin de los datos ms representativos de la realidad a

    partir de los cuales se los pueda obtener un modelo del objeto para trabajar el computador y

    obtener determinados resultados.

    As los lenguajes de programacin proporcionan una serie de tipos de datos simples, como son

    los nmeros enteros, caracteres, nmeros reales. En realidad los lenguajes suministran un modelo

    de datos que son un subconjunto finito de stos, pues la memoria del ordenador es finita. Los

    punteros o apuntadores (si los tiene) son tambin un tipo de datos. El tamao de cada tipo de

    datos depende de la mquina y del compilador sobre los que se trabaja.

    En principio, conocer la representacin interna de estos tipos de datos no es necesaria para

    realizar un programa, pero s puede afectar en algunos casos al rendimiento. Sin embargo, cuando

    se trata con problemas donde el tiempo o el espacio de almacenamiento es primordial, habr que

    entender en detalle no solo los alcances de los tipos de datos sino tambin de su forma de

    almacenamiento.

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    2

    1.3. Clasificacin de las Estructuras de datos

    Segn su comportamiento durante la ejecucin del programa distinguimos dos tipos de

    estructuras: estticas y dinmicas.

    Las estructuras estticas son aquellas en las que el tamao ocupado en memoria se define antes

    de que el programa se ejecute y no puede modificarse dicho tamao durante la ejecucin del

    programa. Cuando el nmero de datos es grande, las operaciones de insercin y eliminacin de

    elementos es una tarea relativamente pesada; es decir los algoritmo deben realizar movimiento de

    grandes cantidades de datos de una posicin a otra. En general ocupan un tamao fijo de

    memoria, aunque hay algunos lenguajes que permiten redefinir su tamao en pena ejecucin. Las

    estructuras estticas se clasifican en arreglos, registros, archivos, conjuntos y strings.

    Por otro lado, las estructuras dinmicas no tienen limitaciones en el tamao de memoria ocupada

    que son propias de las estructuras estticas. El tamao de las estructuras dinmicas se ampla y

    contrae durante la ejecucin del programa. Las estructuras dinmicas se clasifican en lineales y

    no lineales. Las lineales son las pilas, colas y listas enlazadas. Las no lineales son los rboles y

    los grafos.

    Las estructuras dinmicas se diferencian de las estticas, fundamentalmente, en la rapidez con

    que realizan las inserciones y borrados de elementos.

    1.4. Tipos Abstractos de Datos

    Los Tipos Abstractos de Datos (TAD) permiten describir una estructura de datos en funcin de

    las operaciones que pueden efectuar, dejando de lado su implementacin. Esto se denomina

    abstraccin de datos o tipo abstracto de datos. En realidad los propios tipos de datos provistos por

    los lenguajes de programacin son Tipos Abstractos de Datos. Otros ejemplos son tipos muy

    especficos de datos como ser TAD fecha, TAD hora, TAD Polinomio, TAD Racional, TAD

    Array, etc.

    Los TAD combinan estructuras de datos junto a una serie de operaciones de manipulacin.

    Incluyen una especificacin sobre lo que ver el usuario, y una implementacin (algoritmos de

    operaciones sobre las estructuras de datos y su representacin en un lenguaje de programacin),

    que el usuario no tiene necesariamente que conocer para manipular correctamente los tipos

    abstractos de datos.

    Se caracterizan por el encapsulamiento. Es como una caja negra que funciona simplemente

    conectndole unos cables. Esto permite aumentar la complejidad de los programas pero

    manteniendo una claridad suficiente que no desborde a los desarrolladores. Adems, en caso de

    que algo falle ser ms fcil determinar si lo que falla es la caja negra o son los cables.

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    3

    Por ltimo, indicar que un TAD puede ser construido a partir de otro TAD ya definido. Por

    ejemplo se pueden definir pilas, colas y rboles a partir de arrays o listas enlazadas. De hecho, las

    listas enlazadas tambin pueden construirse a partir de arrays y viceversa.

    Los tipos de datos abstractos (TAD) describen un conjunto de objetos con la misma

    representacin y comportamiento. Los tipos abstractos de datos representan una separacin clara

    entre la interfaz externa de un tipo de dato (nivel lgico) y su implementacin interna (nivel

    fsico). La implementacin de un tipo abstracto de datos est oculta, por consiguiente se pueden

    utilizar implementaciones alternativas para un mismo tipo abstracto de datos sin cambiar su

    interfaz favoreciendo as las etapas de correccin y depuracin del software pues se puede

    cambiar o mejorar un algoritmo interno sin cambiar su interfaz de modo tal que no afecta a los

    dems mdulos del software.

    Hoy en da con los nuevos paradigmas de programacin orientada a objetos, la aplicacin de los

    conceptos de abstraccin se aplican mejor en paquetes cerrados llamados (clases) los cuales

    presentan una interfaz al usuario de estas clases permitiendo solo el acceso a los mtodos y

    operaciones definidas para este T.A.D., ocultando los detalles de la implementacin de tales

    mtodos, aplicando as el concepto de abstraccin y facilitando al diseador del software pues

    este utilizara dicha interfaz para construir aplicaciones sin la necesidad de preocuparse por

    detalles de la implementacin del (T.A.D) Gracias a este concepto de abstraccin y la aplicacin

    de la programacin orientada a objetos hoy por hoy se agiliza grandemente la realizacin de

    proyectos de desarrollo de software desde proyectos que se terminaban en aproximadamente un

    ao, a un mes; causando un gran impacto en el mercado del software. Por tanto las compaas de

    desarrollo de software que no apliquen estos conceptos tienden a quedar en una gran desventaja

    con sus competidores.

    En trminos formales, a nivel lgico una Estructura de Datos d se define como una tripleta

    compuesta por con conjunto de dominios D, un conjunto de funciones u operaciones F y un

    conjunto de axiomas A.

    donde:

    D El conjunto de dominios consiste en los tipos de datos primitivos que utiliza la estructura

    F Es el conjunto de funciones que manipulan los datos

    A Describen el significado de las funciones

    1.5 Estructura de datos Arreglo

    Un arreglo es una estructura de datos que consiste en un conjunto de pares ndice-valor, sobre la

    que se definen las operaciones de almacenamiento y recuperacin. Todos los valores o elementos

    d = (D, F, A)

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    4

    de una rreglo son del mismo tipo, es decir es una estructura homognea. El almacenamiento se

    hace asociando un valor con cada ndice y la recuperacin significa que a partir de un ndice se

    puede obtener el valor.

    Aqu en conjunto dominios seran los enteros (para los ndices) y un tipo de dato (para los

    valores), el conjunto de operaciones seran aadir un valor y recuperar un valor. Los axiomas

    sera el significado de aadir un valor y el significado de recuperar un valor.

    Por ejemplo, el siguiente arreglo es de nmeros enteros

    Valores

    (elementos)

    242 666 45 3 -6 321 31 12

    [1] [2] [3] [4] [5] [6] [7] [8]

    Indices

    (posiciones)

    Este es un arreglo de los meses del ao

    Enero Febrero Marzo Abril Mayo Junio Julio Agosto Septiembre Octubre Noviembre Diciembre

    [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12]

    Operaciones con arreglos

    Para realizar operaciones con arreglos, es necesario hacer operaciones a nivel de cada elemento;

    es decir, por ejemplo cargar con datos un arreglo (leer) significara cargar cada elemento mediante

    una instruccin apropiada del lenguaje de programacin.

    Las principales operaciones con arreglos son: leer, imprimir, buscar mximo y mnimo, hallar

    totales y subtotales, buscar un elemento, clasificar u ordenar un arreglo.

    1.6 Bsqueda y clasificacin de arreglos

    La bsqueda de arreglos es un proceso de recuperacin de datos. Consiste en localizar o ubicar la

    posicin de un valor dentro del arreglo, dando como resultado el ndice correspondiente. Existen

    varios mtodos para realizar este proceso, los ms comunes son la bsqueda secuencial y la

    bsqueda binaria.

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    5

    Bsqueda secuencial

    Tambin llamada bsqueda lineal. Este proceso consiste en que dado el valor que se busca, se lo

    debe comparar con cada valor del arreglo hasta dar con el que se busca; en ese momento se

    captura la posicin o ndice. En caso de haber revisado todos los valores y no encontrar el valor,

    se dir que el valor no se encuentra. Un algoritmo para este proceso es el siguiente:

    entero BsquedaSecuencial( V arreglo, n tamao, x valor, i ndice) // devuelve el indice

    Inicio

    encontrado = falso

    i = -1 // posicin ficticia para valor no encontrado

    k = 1

    mientras (no encontrado ) y (k

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    6

    Un algoritmo para el proceso de bsqueda binaria es el siguiente:

    entero BsquedaBinaria( V arreglo, n tamao, x valor, i ndice) // devuelve el indice

    Inicio

    bajo = 1

    alto = n

    encontrado = falso

    i = -1 // posicin ficticia para valor no encontrado

    mientras (no encontrado) y bajo x entonces

    alto = central -1

    sino

    bajo = central + 1

    fin_si

    fin_si

    fin_mientras

    BusquedaBinaria = i

    Fin

    No olvidemos que la bsqueda binaria requiere que el vector est ordenado, y en la prctica esta

    condicin puede ser difcil de mantener, sin embargo, en contrapartida, la bsqueda binaria es un

    mtodo muy rpido ya que el nmero de comparaciones es pequeo en relacin al tamao del

    vector. Se ha determinado que el nmero mximo de comparaciones esta dado por log2 n.

    Esto significar que si se tienen100 elementos, requerirn solo 7 comparaciones como mximo.

    Si son 100000 elementos, el nmero de comparaciones ser de 20.

    Clasificacin

    La clasificacin u ordenacin es el proceso de organizar datos en algn orden o secuencia

    especfica, tal como creciente o decreciente para datos numricos o alfabticamente para datos de

    caracteres.

    La eleccin de algn mtodo de ordenacin depende de tres parmetros: el nmero de datos a

    clasificar, el tipo de datos y la cantidad de memoria disponible.

    Los mtodos de ordenacin se dividen en dos categoras:

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    7

    Ordenacin de arreglos Ordenacin de archivos (ordenacin externa)

    La ordenacin de arreglos se denomina tambin ordenacin interna, ya que se realiza y almacena

    en la memoria de una computadora de gran velocidad y acceso aleatorio. La ordenacin de

    archivos se suele hacer casi siempre sobre soportes de almacenamiento externo, discos, cintas,

    etc. Por ello se denomina tambin ordenacin externa. Estos dispositivos son ms lentos en las

    operaciones de E/S, pero por el contrario, pueden contener mayor cantidad de informacin.

    En este curso veremos solo la ordenacin interna. Los principales mtodos de ordenacin de

    arreglos son:

    Insercin o Insercin directa (baraja)

    o Insercin binaria

    Intercambio o Burbuja

    o Pares no adyacentes

    Seleccin Shell Ordenacin rpida (quick-sort)

    Mtodo de intercambio o de Burbuja

    Este mtodo se basa en el principio de comparar pares de elementos adyacentes e intercambiarlos

    entre si hasta que estn ordenados. El algoritmo burbuja es el siguiente

    Burbuja(V vector, n tamao)

    Inicio

    bandera = Falso

    mientras bandera = Falso hacer

    bandera = Verdadero

    para k = 1 hasta n-1

    si V[k] > V[k+1] entonces

    Intercambiar(V[k], V[k+1])

    bandera = Falso

    fin_si

    fin_para

    fin_mientras

    Fin

    Intercambiar (x, valor, y valor)

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    8

    Inicio

    temporal = x

    x = y

    y = temporal

    Fin

    Mtodo de la Baraja

    Es un mtodo de insercin, consiste en insertar un elemento en una parte del vector ya ordenada y

    comenzar de nuevo con los elementos restantes. Por ser utilizado generalmente por los jugadores

    de cartas se le conoce con el nombre de Baraja.

    Baraja(V vector, n tamao)

    Inicio

    para i = 2 hasta n

    aux = V[i]

    k = i - 1

    u = i-1

    bandera = Falso

    mientras bandera < > Falso y k >= 1 hacer

    si aux < V[k] entonces

    V[k+1] = V[k]

    k = k 1

    sino

    bandera = Verdad

    fin_si

    fin_para

    fin_mientras

    V[k+1] = aux

    Fin

    Metodo QuickSort

    El ordenamiento rpido (quicksort en ingls) es un algoritmo basado en la tcnica de divide y

    vencers, que permite, en promedio, ordenar n elementos en un tiempo proporcional a n log n.

    Esta es la tcnica de ordenamiento ms rpida conocida. Fue desarrollada por Carl Antony R.

    Hoare en 1960.

    El algoritmo fundamental es el siguiente:

    Elegir un elemento de la lista de elementos a ordenar, al que llamaremos pivote. Reubicar los dems elementos de la lista a cada lado del pivote, de manera que a un lado

    queden todos los menores que l, y al otro los mayores. En este momento, el pivote ocupa

    exactamente el lugar que le corresponder en la lista ordenada.

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    9

    La lista queda separada en dos sublistas, una formada por los elementos a la izquierda del pivote, y otra por los elementos a su derecha.

    Repetir este proceso de forma recursiva para cada sublista mientras stas contengan ms de un elemento. Una vez terminado este proceso todos los elementos estarn ordenados.

    Como se puede suponer, la eficiencia del algoritmo depende de la posicin en la que termine el

    pivote elegido.

    En el mejor caso, el pivote termina en el centro de la lista, dividindola en dos sublistas de igual tamao. En este caso, el orden de complejidad del algoritmo es O(nlog n).

    En el peor caso, el pivote termina en un extremo de la lista. El orden de complejidad del algoritmo es entonces de O(n). El peor caso depender de la implementacin del algoritmo,

    aunque habitualmente ocurre en listas que se encuentran ordenadas, o casi ordenadas.

    En el caso promedio, el orden es O(nlog n).

    No es extrao, pues, que la mayora de optimizaciones que se aplican al algoritmo se centren en

    la eleccin del pivote. Una versin en C++ que ordena un vector de tipo numrico es la siguiente

    es la siguiente:

    void QuickSort(float V[], int m, int N)

    {

    int i, j, p;

    if (m < N)

    {

    i = m; j = (N) + 1; p = V[m];

    do

    {

    do i++; while(V[i]p);

    if (i

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    10

    2. Estructura de lenguajes de programacin orientados a objeto.

    2.1 . Aspectos generales de los lenguajes

    Si se echa un vistazo a la historia de la ingeniera del software, prestando particular atencin a

    cmo ha evolucionado, se puede observar que los progresos ms significativos se han obtenido

    gracias a la aplicacin de uno de los principios fundamentales a la hora de resolver cualquier

    problema, incluso de la vida cotidiana, la descomposicin de un sistema complejo en partes que

    sean ms fciles de manejar, es decir, gracias a la aplicacin del dicho popular conocido como

    divide y vencers.

    En los primeros estadios de desarrollo de los lenguajes de programacin (Basic, Fortran) se tena

    un cdigo en el que no haba separacin de conceptos, datos y funcionalidad se mezclaban sin

    una lnea divisoria clara. A esta etapa se la conoce como la del cdigo spaghetti, ya que se tena

    una maraa entre datos y funcionalidad que recuerda a la que se forma del plato de esta pasta

    italiana. En la siguiente etapa (Algol, Pascal, C) se pas a aplicar la llamada descomposicin

    funcional, (da origen a la llamada programacin modular) que pone en prctica el principio de

    divide y vencers identificando las partes ms manejables como funciones que se definen en el

    dominio del problema. La principal ventaja que proporciona esta descomposicin es la facilidad

    de integracin de nuevas funciones, aunque tambin tiene grandes inconvenientes, como son el

    hecho de que las funciones quedan algunas veces poco claras debido a la utilizacin de datos

    compartidos, y el que los datos quedan esparcidos por todo el cdigo, con lo cual, normalmente el

    integrar un nuevo tipo de datos implica que se tengan que modificar varias funciones.

    Intentando solventar estas desventajas con respecto a los datos, se dio otro paso en el desarrollo

    de los sistemas software (lenguajes Smalltalk, Eiffel, C++, Java, Delphi, Phyton,). La

    programacin orientada a objetos (POO) ha supuesto uno de los avances ms importantes de los

    ltimos aos en la ingeniera del software para construir sistemas complejos utilizando el

    principio de descomposicin, ya que el modelo de objetos subyacente se ajusta mejor a los

    problemas del dominio real que la descomposicin funcional. La ventaja que tiene es que es fcil

    la integracin de nuevos datos, aunque tambin quedan las funciones esparcidas por todo el

    cdigo, y tiene los inconvenientes de que, con frecuencia, para realizar la integracin de nuevas

    funciones hay que modificar varios objetos, y de que se produce un enmaraamiento de los

    objetos en funciones de alto nivel que involucran a varias clases.

    En la Figura 1 se representa mediante un esquema los distintos estadios en la evolucin de los

    sistemas software. En este esquema se refleja de forma clara la mezcla de conceptos que se

    produce en cada una de las etapas de la evolucin (etapas comnmente conocidas como

    generaciones). Si cada una de las distintas formas que aparecen dibujadas (tringulo, cuadrado,

    trapecio, elipse) representa a un tipo de datos distinto, y cada color o tonalidad representa a una

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    11

    funcin distinta, se tiene que en la primera generacin de los sistemas software funciones y datos

    se entremezclaban.

    En la segunda y tercera generacin se tienen conjuntos de elementos agrupados por tonalidades, y

    en cada conjunto conviven distintas formas, lo que nos indica que la descomposicin del sistema

    se hace en base a las funciones (tonalidades), y que los datos quedan esparcidos por todos los

    conjuntos.

    En la cuarta generacin, sin embargo, esta agrupacin se realiza en base a las formas (datos), pero

    como se puede observar, en cada conjunto tenemos representadas distintas funcionalidades

    (tonalidades), con lo cual stas tambin se nos dispersan por todo el sistema.

    Uno de los principales inconvenientes con el que nos encontramos al aplicar estas

    descomposiciones ya tradicionales es que muchas veces se tienen ejecuciones ineficientes debido

    a que las unidades de descomposicin no siempre van acompaadas de un buen tratamiento de

    aspectos tales como la gestin de memoria, la coordinacin, la distribucin, las restricciones de

    tiempo real, ...

    En el desarrollo de un sistema software adems del diseo y la implementacin de la

    funcionalidad bsica, se recogen otros aspectos tales como la sincronizacin, la distribucin, el

    manejo de errores, la optimizacin de la memoria, la gestin de seguridad, etc. Mientras que las

    descomposiciones funcional y orientada a objetos no nos plantean ningn problema con respecto

    al diseo y la implementacin de la funcionalidad bsica, estas tcnicas no se comportan bien con

    los otros aspectos. Es decir, que nos encontramos con problemas de programacin en los cuales

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    12

    ni las tcnicas funcionales, ni las orientadas a objeto son suficientes para capturar todas las

    decisiones de diseo que el programa debe implementar.

    Con las descomposiciones tradicionales no se aislan bien estos otros aspectos, sino que quedan

    diseminados por todo el sistema enmaraando el cdigo que implementa la funcionalidad bsica,

    y yendo en contra de la claridad del mismo. Se puede afirmar entonces que las tcnicas

    tradicionales no soportan bien la separacin de competencias para aspectos distintos de la

    funcionalidad bsica de un sistema, y que esta situacin claramente tiene un impacto negativo en

    la calidad del software.

    La programacin orientada a aspectos (POA) es una nueva metodologa de programacin que aspira

    a soportar la separacin de competencias para los aspectos antes mencionados. Es decir, que

    intenta separar los componentes y los aspectos unos de otros, proporcionando mecanismos que

    hagan posible abstraerlos y componerlos para formar todo el sistema. En definitiva, lo que se

    persigue es implementar una aplicacin de forma eficiente y fcil de entender.

    2.2 Lenguajes orientados a objeto

    Los lenguajes orientados a objeto se basan en un concepto fundamental llamado objeto y en toda

    la tecnologa desarrollada en torno a l. Muchos lenguajes se declaran Orientados a Objetos. Pero

    la definicin exacta del trmino depende de muchos rasgos y conceptos que se deben cumplir en

    su totalidad; estos rasgos y caractersticas son:

    1. Ocultamiento y encapsulamiento de la informacin

    2. Herencia

    3. Polimorfismo

    4. Todos los tipos de datos predefinidos son objetos

    5. Todas las operaciones realizan envo de mensajes a objetos

    6. Todos los tipos de datos definidos por los usuarios son objetos

    Para propsito de esta discusin, un lenguaje ser considerado Orientado a Objetos Puro si

    satisface todos los seis tems nombrados. Ser hbrido si slo cumple con algunos de esos 6

    lineamientos (por lo generar son hbridos cumpliendo los tres primeros).

    Programacin Orientada a Objeto

    Los objetos son entidades que combinan estado, comportamiento e identidad:

    El estado est compuesto de datos, sern uno o varios atributos a los que se habrn

    asignado unos valores concretos (datos).

    El comportamiento est definido por los procedimientos o mtodos con que puede operar

    dicho objeto, es decir, qu operaciones se pueden realizar con l.

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    13

    La identidad es una propiedad de un objeto que lo diferencia del resto, dicho con otras

    palabras, es su identificador (concepto anlogo al de identificador de una variable o una

    constante).

    La programacin orientada a objetos expresa un programa como un conjunto de estos objetos,

    que colaboran entre ellos para realizar tareas. Esto permite hacer los programas y mdulos ms

    fciles de escribir, mantener y reutilizar.

    De esta forma, un objeto contiene toda la informacin que permite definirlo e identificarlo frente

    a otros objetos pertenecientes a otras clases e incluso frente a objetos de una misma clase, al

    poder tener valores bien diferenciados en sus atributos. A su vez, los objetos disponen de

    mecanismos de interaccin llamados mtodos que favorecen la comunicacin entre ellos. Esta

    comunicacin favorece a su vez el cambio de estado en los propios objetos. Esta caracterstica

    lleva a tratarlos como unidades indivisibles, en las que no se separan ni deben separarse el estado

    y el comportamiento.

    Los mtodos (comportamiento) y atributos (estado) estn estrechamente relacionados por la

    propiedad de conjunto. Esta propiedad destaca que una clase requiere de mtodos para poder

    tratar los atributos con los que cuenta. El programador debe pensar indistintamente en ambos

    conceptos, sin separar ni darle mayor importancia a ninguno de ellos, hacerlo podra producir el

    hbito errneo de crear clases contenedoras de informacin por un lado y clases con mtodos que

    manejen a las primeras por el otro.

    Entre los lenguajes orientados a objetos se destacan los siguientes:

    Ada

    C++

    C#

    Lenguaje de programacin D

    Object Pascal (Delphi)

    Eiffel

    Java

    JavaScript (la herencia se realiza por medio de la programacin basada en prototipos)

    Lexico (en castellano)

    Objective-C

    Ocaml

    Oz

    Lenguaje de programacin R

    Perl

    PHP (en su versin 5)

    Python

    Ruby

    Smalltalk

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    14

    Magik (SmallWorld)

    VB.NET

    Visual FoxPro (en su versin 6)

    Visual Basic

    XBase++

    Muchos de estos lenguajes de programacin no son puramente orientados a objetos, sino que son

    hbridos que combinan la POO con otros paradigmas

    2.2. Estructuras de datos orientadas a objetos

    Las Estructuras de Datos Orientadas a Objeto EDOO, pueden ser obtenidas directamente a partir

    de los Tipos Abstractos de Datos, con solo aadirles, si es necesario, la funcionalidad, a travs de

    la implementacin de sus operaciones. De este modo los TDA se convierten en clases, por lo

    tanto, toda la tecnologa y la terminologa de la POO se aplica a las estructuras de datos

    Orientadas a Objeto.

    Los conceptos fundamentales y la terminologa a ser utilizados en la definicin de las EDOO son

    los siguientes:

    Clase: definiciones de las propiedades y comportamiento de un tipo de objeto concreto.

    La instanciacin es la lectura de estas definiciones y la creacin de un objeto a partir de

    ellas.

    Herencia: (por ejemplo, herencia de la clase D a la clase C) Es la facilidad mediante la

    cual la clase D hereda en ella cada uno de los atributos y operaciones de C, como si esos

    atributos y operaciones hubiesen sido definidos por la misma D. Por lo tanto, puede usar

    los mismos mtodos y variables publicas declaradas en C. Los componentes registrados

    como "privados" (private) tambin se heredan, pero como no pertenecen a la clase, se

    mantienen escondidos al programador y solo pueden ser accesado a travs de otros

    mtodos publicos. Esto es as para mantener hegemnico el ideal de OOP.

    Objeto: entidad provista de un conjunto de propiedades o atributos (datos) y de

    comportamiento o funcionalidad (mtodos). Se corresponde con los objetos reales del

    mundo que nos rodea, o a objetos internos del sistema (del programa). Es una instancia a

    una clase.

    Mtodo: Algoritmo asociado a un objeto (o a una clase de objetos), cuya ejecucin se

    desencadena tras la recepcin de un "mensaje". Desde el punto de vista del

    comportamiento, es lo que el objeto puede hacer. Un mtodo puede producir un cambio

    en las propiedades del objeto, o la generacin de un "evento" con un nuevo mensaje para

    otro objeto del sistema.

    Evento: un suceso en el sistema (tal como una interaccin del usuario con la mquina, o

    un mensaje enviado por un objeto). El sistema maneja el evento enviando el mensaje

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    15

    adecuado al objeto pertinente. Tambin se puede definir como evento, a la reaccin que

    puede desencadenar un objeto, es decir la accin que genera.

    Mensaje: una comunicacin dirigida a un objeto, que le ordena que ejecute uno de sus

    mtodos con ciertos parmetros asociados al evento que lo gener.

    Propiedad o atributo: contenedor de un tipo de datos asociados a un objeto (o a una

    clase de objetos), que hace los datos visibles desde fuera del objeto y esto se define como

    sus caractersticas predeterminadas, y cuyo valor puede ser alterado por la ejecucin de

    algn mtodo.

    Estado interno: es una variable que se declara privada, que puede ser nicamente

    accedida y alterada por un mtodo del objeto, y que se utiliza para indicar distintas

    situaciones posibles para el objeto (o clase de objetos). No es visible al programador que

    maneja una instancia de la clase.

    Componentes de un objeto: atributos, identidad, relaciones y mtodos.

    Representacin de un objeto: un objeto se representa por medio de una tabla o entidad

    que est compuesta por sus atributos y funciones correspondientes.

    2.4. Recursividad y lenguajes de programacin OO

    Concepto de Recursividad

    La recursividad constituye una de las herramientas ms potentes en programacin. Es un

    concepto matemtico conocido. Esencialmente, un proceso es recursivo cuando en su

    procesamiento se utiliza a si mismo. Dentro de la recursividad se distinguen dos situaciones

    llamadas caso base (final) y caso general (recursivo).

    Caso Base

    Son hechos verdadero que no requieren demostracin. En esta parte del algoritmo no existen

    llamadas recursivas, son condiciones de terminacin de ciclos o llamadas recursivas. Un

    algoritmo recursivo puede tener varios casos base.

    Caso General

    Son hechos que se definen en funcin al cumplimiento de una definicin previa. Estas

    definiciones previas las define el mismo algoritmo en llamadas a si mismo con parmetros que

    aseguren el cumplimiento de uno de los casos base en cada llamada recursiva.

    La recursividad se expresa, generalmente, mediante una funcin recursiva. Una funcin que se

    llama as misma se denomina recursiva. Podemos usar recursividad si la solucin de un problema

    est expresada en funcin de si misma, aunque de menor tamao y conocemos la solucin no-

    recursiva para un determinado caso.

    Ventajas: No es necesario definir la secuencia de pasos exacta para resolver el problema.

    Desventajas: Podra ser menos eficiente.

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    16

    Para que una definicin recursiva est completamente identificada es necesario tener un caso base

    que no se calcule utilizando casos anteriores y que la divisin del problema converja a ese caso

    base.

    Ejemplo: La potencia recursiva

    1 si n = 0 (caso base)

    xn =

    x xn1

    si n > 0 (caso general)

    Otra funcin recursiva es el factorial. Como se puede ver a continuacin la definicin recursiva

    es clara.

    Definicin recursiva de factorial

    1 si n = 0

    n! =

    n . (n 1)! si n > 0

    Por ejemplo calculamos el factorial con n=3. Este proceso se muestra paso a paso a continuacin:

    1) 3! = 3 * 2!

    2) 3! = 3 * 2!

    2! = 2 * 1!

    3) 3! = 3 * 2!

    2! = 2 * 1!

    1! = 1 * 0!

    4) 3! = 3 * 2!

    2! = 2 * 1!

    1! = 1 * 0!

    0! = 1 (caso base)

    5) 3! = 3 * 2!

    2! = 2 * 1!

    1! = 1 * 1

    1

    6) 3! = 3 * 2!

    2! = 2 * 1

    1! = 1 * 1 = 1

    7) 3! = 3 * 2

    2! = 2 * 1 = 2

    8) 3! = 3 * 2 = 6

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    17

    El algoritmo del factorial recursivo es el siguiente:

    int factorial (int n) {

    if (n==0) //Caso base

    return 1;

    else //Caso general

    return n*factorial(n-1);

    }

    Otros ejemplos de funciones recursivas:

    1. Clculo de la potencia

    1 si n = 0

    xn =

    x xn1

    si n > 0

    int potencia(int base, int expo){

    if (expo==0)

    return 1;

    else

    return base * potencia(base,expo-1);

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    18

    }

    2. La suma de forma recursiva

    a si b = 0

    suma(a, b) =

    1 + suma(a, b 1) si b > 0

    int suma(int a, int b){

    if (b==0)

    return a;

    else

    return 1+suma(a,b-1);

    }

    3. Bsqueda lineal recursiva (con dos casos base)

    Verdad si V [n] = b

    Falso si V [0] 6= b

    BusquedaLineal(V, n, b) =

    (V [n] == b) (b 2 {V [0], . . . , V [n 1]}) en otro caso

    int BusquedaLineal(int *V, int n, int b)

    {

    if (n x, el elemento buscado est en una posicin menor que t, entonces

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    19

    BusBinRec(v, i, t-1, x)

    3. Al modificar los extremos puede darse que i > d, en cuyo caso el proceso termina (Fracaso).

    int BusBinRec (int v[], int i, int d, int x) // v arreglo, d tamao, x valor

    {

    int centro;

    if (ix) // Buscar izda.

    return BusBinRec (v,i,centro-1,x);

    else // Buscar dcha.

    return BusBinRec (v,centro+1,d,x);

    }

    else // i > d

    return -1; // Caso base 2

    }

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    20

    3. Almacenamiento esttico en secuencia Listas

    3.1 Aspectos generales de listas

    Una lista es un conjunto lineal de elementos o valores del mismo tipo que se encuentran

    ordenados y pueden variar en nmero.

    Los elementos de una lista se almacenan normalmente en forma contigua, es decir un elemento

    despus de otro, en posiciones consecutivas de memoria. Una lista lineal se almacena en la

    memoria principal de una computadora en posiciones contiguas sucesivas de memoria. Esta

    asignacin de memoria se denomina almacenamiento secuencial o esttico.

    Las lneas as definidas se llaman contiguas. Las operaciones que se pueden realizar con listas

    lineales son las siguientes:

    1. Insertar, eliminar o localizar un elemento

    2. Determinar el tamao de la lista nmero de elementos

    3. Recorrer la lista para localizar un determinado elemento

    4. Clasificar los elementos de la lista en orden ascendente o descendente

    5. Unir dos o ms listas en una sola

    6. Dividir una lista en varias sublistas

    7. Copiar un a lista

    8. Borrar una lista

    Una lista lineal se almacena en la memoria de la computadora en posiciones sucesivas o

    adyacentes y se procesa como un arreglo unidimensional. En este caso el acceso a cualquier

    elemento de la lista y la adicin de nuevos elementos es fcil; sin embargo, la insercin o borrado

    requieren desplazamiento de lugar de los elementos que le siguen y, en consecuencia, el diseo

    de algoritmos especficos.

    Las operaciones de aadir y eliminar se efectan nicamente en los extremos de la lista. Esta

    limitacin es una de las razones por las que esta estructura de datos es poco utilizada como tal;

    sin embargo, es til en casos donde la cantidad de inserciones y/o eliminaciones es reducida, es

    decir la estructura es esttica. Asimismo, esta estructura permite disear otras estructuras ms

    complejas, implementndolas de manera sencilla; en especial las estructuras dinmicas de pilas y

    colas.

    3.2. Pilas

    Una pila (o stack) es un tipo especial de lista lineal en la que la insercin y el borrado de nuevos

    elementos se realiza slo por un extremo que se denomina cima o tope (top).

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    21

    La pila es una estructura con numerosas analogas en la vida real: una pila de platos, una pila de

    monedas, una pila de cajas de zapatos, una pila de bandeja, un a pila de libros, etc.

    Dado que la operacin de insertar solo puede hacerse por un extremo, -el superior- los elementos

    solo pueden eliminarse en orden inverso al que se insertaron en la pilas. El ltimo elemento que

    se pone en la pila es el primero que se puede sacar; por ello, a estas estructuras se les conoce por

    el nombre LIFO (Last In, First Out) o UEPS (Ultimo en Entrar, Primero en Salir).

    Las pilas se pueden representar como en la figura de la izquierda y se pueden implementar en un

    arreglo con un determinado tamao, como el la figura de la derecha.

    Arreglo que implementa una pila

    Cima Cima Longitud mxima de la pila

    Otra manera de implementar pilas es de manera dinmica a travs de nodos con punteros; sin

    embargo, cualquiera que sea su implementacin, las operaciones sobre las pilas son las mismas y

    deben ser transparentes para su utilizacin.

    Las operaciones bsicas sobre una pila son: poner o meter un nuevo elemento y sacar o quitar un

    elemento. En la siguiente lista se muestran estas y otras operaciones y su significado:

    P = Cima Apuntador a la cima de la pila

    esVaca Funcin lgica que indica si la pila est vaca

    Poner Subprograma para aadir elementos

    Sacar Subprograma para quitar elementos

    LongMax Longitud mxima que puede tener la pila

    Entre las muchas aplicaciones de las pilas estn las que se usan en ciencias de la computacin

    como el rastreo de llamados a subprogramas, el control de bucles, la evaluacin de expresiones

    aritmticas, etc.

    Aplicacin de pila: Evaluacin de expresiones

    Esta aplicacin consiste en calcular el valor de una expresin aritmtica dada; es decir, siguiendo

    las reglas de la aritmtica se debe obtener un valor final. Las expresiones aritmticas,

    1 2 P-1 P n-1 n

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    22

    normalmente se escriben en una notacin denominada infija, en la que el operador se encuentra

    en medio de los operandos.

    Proceso para evaluacin de una expresin aritmtica

    Una expresin aritmtica escrita normalmente en notacin infija, se evala segn los siguientes

    pasos:

    1. Transformar la expresin de infija o postfija

    2. Evaluar la expresin en postfija

    Se entiende que la notacin postfija es aquella cuyos operandos aparecen primero, luego aparece

    el operador.

    Para resolver cada paso es fundamental que los algoritmos utilicen pilas.

    Transformacin de infija a postfija

    Se parte de una expresin en notacin infija que tiene operandos, operadores y puede tener

    parntesis. Los operandos vienen representados por letras, los operadores van a ser:

    Operadores: ^, *, / , +, -

    La transformacin se realiza utilizando una pila en la que se almacenan los operadores y los

    parntesis izquierdos. La expresin se va leyendo carcter a carcter, los operandos pasan

    directamente a formar parte de la expresin en postfija.

    Los operadores se meten en la pila siempre que esta est vaca, o bien siempre que tengan

    mayor prioridad que el operador cima de la pila (o bien igual si es la mxima prioridad).

    Si la prioridad es menor o igual se saca el elemento cima de la pila y se vuelve a hacer la

    comparacin con el nuevo elemento cima.

    Los parntesis izquierdos siempre se meten en la pila, asignndoles la mnima prioridad. Cuando

    se lee un parntesis derecho, hay que sacar todos los operadores de la pila pasando a formar parte

    de la expresin postfija, hasta llegar a un parntesis izquierdo, el cual se elimina de la pila, ya que

    los parntesis no forman parte de la expresin postfija.

    El algoritmo termina cuando no hay ms elementos en la expresin infija, y la pila esta vaca.

    Sea por ejemplo la expresin infija

    A + B * C / ( D E ) - F

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    23

    En consecuencia, la expresin postfija resultante es

    A B C * D E - / + F -

    Con el fin de que el algoritmo de conversin de infija a postfija se pueda manejar mejor, es

    necesario definir prioridades para los operadores y el parntesis izquierdo.

    Operador Prioridad

    ^

    *, /

    +, -

    (

    3

    2

    1

    0 (dentro)

    Items en

    Proceso

    Expresin

    postfija

    Resultante

    Estado de la

    PILA Comentario

    A A Pila vacia El operando A va a expresin postfija.

    + A + El operador + va a la pila, ya que est vaca.

    B * AB + *

    El operando B va a expresin postfija y el operador *

    tiene mayor prioridad que la cima de la pila, en

    consecuencia va a la pila

    C / ABC* + /

    El operando C va a expresin postfija y el operador /

    tiene menor o igual prioridad que la cima de la

    pila, por tanto, salen tems de la pila hasta un item

    de menor prioridad. Luego / entra a la pila.

    ( ABC* + / ( El parntesis izquierdo ( siempre va a la pila.

    D - ABC*D + / ( - El operando D va a expresin postfija. El operador

    tiene mayor prioridad que la cima, va a la pila.

    E ) ABC*DE- + /

    El operando E va a expresin postfija. El parntesis

    derecho ) no va a la pila, solo obliga a sacar tems

    de la pila hasta un parntesis izquierdo ( inclusive.

    - ABC*DE-/+ -

    El operador tiene menor o igual prioridad que la

    cima, en consecuencia salen de la pila hasta un

    operador de menor prioridad que l. Luego el

    entra a la pila.

    F ABC*DE-/+F - El operando F va a la expresin postfija

    No hay ABC*DE-/+F- Pila vacia Como ya no hay ms tems en la expresin, la pila se

    debe vaciar.

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    24

    Ejercicio.

    1. Hallar el equivalente postfijo de la siguiente expresin infija: A*(B+C(D/E^F)+G)-H

    Respuesta ABC+DEF^/-G+*H-

    2. Escribir el algoritmo para convertir una expresin infija en postfija.

    3.3. Colas

    Al igual que las pilas, las colas son estructuras de listas lineales pero con una disciplina diferente

    de aquellas. Las colas insertan elemento por un extremo y sacan elementos por el otro. Esto se

    conoce como FIFO (First In, First Out) o PEPS (Primero en Entrar, Primero en Salir).

    Las eliminaciones se realizan por el comienzo de la lista (front) llamado frente, y las inserciones

    se realizan por el otro extremo (rear) o final

    En la vida real se tienen numerosos ejemplos de colas: la cola de un cine, la cola de atencin en

    un banco, una cola de vehculos en una gasolinera, etc. En todas ellas, el primero en llegar es el

    primero en ser atendido.

    En el campo de informtica tambin se encuentran muchas aplicaciones de colas. Por ejemplo en

    un sistema informtico suele haber una impresora que atiende las solicitudes de impresin en el

    orden de una cola. Existe otra aplicacin en un sistema de tiempo compartido, donde un

    procesador central atiende la peticin de proceso segn el orden de llegada, suponiendo que

    existen varias terminales, y otros perifricos que demandan tiempo de procesador.

    Un ejemplo bastante actual de aplicacin de colas lo constituye el proceso de atencin al pblico

    por parte de bancos y otras entidades. En este caso se pueden presentar no solo una sino varias

    colas, en funcin de determinados criterios de atencin o prioridad.

    Eliminacin Insercin

    Frente Final

    Las colas se pueden implementar en forma esttica mediante arreglos, como se ve en la figura, o

    bien con el uso de punteros, en forma dinmica.

    Cuando se implementa en forma esttica en un arreglo se presenta el problema de que luego de

    varias inserciones y eliminaciones, la cola parece viajar por el arreglo, hasta que llega a su

    lmite final, en cuyo caso el estado de la cola ser aparentemente de cola llena, sin embargo, en el

    1 2 n-1 n

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    25

    frente de la cola pueden haber espacios vacos. Una forma de superar esta limitacin es utilizando

    el arreglo como un espacio circular que se recicla con el primer elemento, cada vez que la cola

    alcanza el final del arreglo. Este problema se puede abordar de diferentes maneras.

    La implementacin ms adecuada para colas es mediante las llamadas listas encadenadas,

    mediante el uso de punteros. Esta implementacin se estudiar ms adelante.

    Operaciones Bsicas

    Crear: se crea la cola vaca.

    Poner (push): se aade un

    elemento a la cola. Se aade

    al final de esta.

    Sacar (pop): se elimina el

    elemento frontal de la cola,

    es decir, el primer elemento

    que entr.

    Frente (consultar, front): se

    devuelve el elemento frontal

    de la cola, es decir, el

    primero elemento que entr.

    Implementacin de la operaciones

    Las operaciones bsicas sobre una cola son: poner o meter un nuevo elemento al final y sacar o

    quitar un elemento del frente. En la siguiente lista se muestran estas y otras operaciones y su

    significado:

    F = Frente Apuntador hacia el frente de la cola

    R = Final Apuntador hacia el final de la cola

    esVaca Funcin lgica que indica si la cola est vaca

    Poner Subprograma para aadir elementos por el frente

    Sacar Subprograma para quitar elementos por el final

    LongMax Longitud mxima que puede tener la cola

    Aplicaciones

    Ejemplos de colas en la vida real seran: personas comprando en un supermercado, esperando

    para entrar a ver un partido de futbol, esperando en el cine para ver una pelcula, una pequea

    peluquera, las colas en los bancos, etc. La idea esencial es que son todos lneas de espera.

    En estos casos, el primer elemento de la lista realiza su funcin (pagar comida, pagar entrada para

    el partido o para el cine) y deja la cola. Este movimiento est representado en la cola por la

    funcin pop o desencolar. Cada vez que otro elemento se aade a la lista de espera se aaden al

    final de la cola representando la funcin push o encolar. Hay otras funciones auxiliares para ver

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    26

    el tamao de la cola (size), para ver si est vaca en el caso de que no haya nadie esperando

    (empty) o para ver el primer elemento de la cola (front).

    Las colas tambin se utilizan en muchas maneras en los sistemas operativos para planificar el uso

    de los distintos recursos de la computadora. Uno de estos recursos es la propia CPU (Unidad

    Central de Procesamiento).

    Si esta trabajando en una sistema multiusuario, cuando le dice a la computadora que ejecute un

    programa concreto, el sistema operativo aade su peticin a su cola de trabajo.

    Cuando su peticin llega al frente de la cola, el programa solicitado pasa a ejecutarse.

    Igualmente, las colas se utilizan para asignar tiempo a los distintos usuarios de los dispositivos

    de entrada/salida (E/S), impresoras, discos, cintas y dems. El sistema operativo mantiene colas

    para peticiones de imprimir, leer o escribir en cada uno de estos dispositivos.

    Implementacin de colas en C++

    #ifndef COLA

    #define COLA // define la cola

    template

    class Cola {

    private:

    struct Nodo {

    T elemento;

    Nodo* siguiente; // coloca el nodo en la segunda posicion

    }* primero;

    Nodo* ultimo;

    unsigned int elementos;

    public:

    Cola() {

    elementos = 0;

    }

    ~Cola() {

    while (elementos != 0) pop();

    }

    void push(const T& elem) {

    Nodo* aux = new Nodo;

    aux->elemento = elem;

    if (elementos == 0) primero = aux;

    else ultimo->siguiente = aux;

    ultimo = aux;

    ++elementos;

    }

    void pop() {

    Nodo* aux = primero;

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    27

    primero = primero->siguiente;

    delete aux;

    --elementos;

    }

    T consultar() const {

    return primero->elemento;

    }

    bool vacia() const {

    return elementos == 0;

    }

    unsigned int size() const {

    return elementos;

    }

    };

    #endif

    Tipos de colas

    Colas circulares (anillos): en las que el ltimo elemento y el primero estn unidos.

    Colas de prioridad: En ellas, los elementos se atienden en el orden indicado por una

    prioridad asociada a cada uno. Si varios elementos tienen la misma prioridad, se atendern

    de modo convencional segn la posicin que ocupen. Hay 2 formas de implementacin:

    1. Aadir un campo a cada nodo con su prioridad. Resulta conveniente mantener la cola ordenada por orden de prioridad.

    2. Crear tantas colas como prioridades haya, y almacenar cada elemento en su cola.

    Bicolas: son colas en donde los nodos se pueden aadir y quitar por ambos extremos; se

    les llama DEQUE (Double Ended QUEue). Para representar las bicolas lo podemos hacer

    con un array circular con Inicio y Fin que apunten a cada uno de los extremos. Hay

    variantes:

    Bicolas de entrada restringida: Son aquellas donde la insercin slo se hace por el final,

    aunque podemos eliminar al inicio al final.

    Bicolas de salida restringida: Son aquellas donde slo se elimina por el final, aunque se

    puede insertar al inicio y al final.

    3.4. Problemas de aplicacin de pilas, colas y listas

    Aplicaciones de Pila

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    28

    Problema 1. Implementar un programa para administrar una pila.

    Problema 2. En el lgebra, comunmente se utilizan signos de agrupacin tales como ( ), [ ] o { },

    y se pueden utilizar para indicar el orden en que se realizarn las operaciones aritmeticas.

    Ej. [a(x+y)+c]d+ (b(c+d)),

    sin embargo, existen ciertas formas invalidas de utilizar dichos signos de agrupacin

    Ej [a+b) (a (b)) o tambien ([a+b)c].

    Es decir, cada signo que abre debe tener un signo correspondiente que lo cierre, cada signo que cierra debe de tener un signo correspondiente qu cerrar, y los signos no se pueden traslapar. Escribe un programa, que dada una expresin algebrarica, determine si tiene o no error

    en los signos de agrupacin en tiempo lineal.

    Problema 3. Una manera de encriptar mensajes(no muy segura), es colocar parentesis de manera

    arbitraria, y todo lo que esta dentro de un parentesis, ponerlo al reves, por ejemplo Olimpiada de Informatica se puede encriptar como Olimpia(ad) de I(rofn)matica, los parentesis tambien se pueden anidar, es decir, otra forma de encriptar el mismo mensaje podra ser Olimpia(am(nfor)I ed (da))tica. Escribe un programa, que dado un mensaje encriptado, determine el mensaje original en tiempo lineal.

    (9 Olimpiada Mexicana de Informtica)

    Problema 4. Hay n faros acomodados en lnea recta, cada faro puede tener una altura arbitraria, y

    adems, cada faro brilla con cierta intensidad. La luz de cada faro ilumina unicamente a los

    primeros faros en cada direccin cuyas alturas sean estrictamente mayores a la del faro que emite

    la luz. La iluminacin total de un faro, es la suma de las luces que llegan al faro(sin incluir la

    propia). Escribe un programa, que dadas las alturas de los n faros y las intensidades de cada uno,

    determine cual es el faro mas iluminado en tiempo lineal.

    (USACO 2006)

    Problema 5. Una cuadricula bicolorada, es aquella en la cual cada cuadro puede estar pintado de

    color negro o de color blanco(todos los cuadros estan pintados de alguno de estos 2 colores).

    Puedes asumir que cada casilla de la cuadricula tiene area 1. Escribe un programa, que dada una

    cuadricula bicolorada, determine el rea del mayor rectangulo (dentro de la cuadricula) pintado

    de un solo color. Tu programa deber funcionar en tiempo lineal (lineal en funcin del nmero de

    casillas de la cuadricula, NO en funcin de la base o de la altura).

    (Croatian Olympiad in Informatics)

    Problema 6. Considera el siguiente algoritmo recursivo para generar permutaciones de arreglo[ ]

    desde inicio hasta fin:

    1 funcion permuta(arreglo[ ],inicio, fin)

    2 si inicio=fin entonces

    3 imprime arreglo[ ];

    4 fin_de_funcion;

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    29

    5 para i=inicio hasta fin

    6 intercambia(arreglo[inicio], arreglo[i]);

    7 pemuta(arreglo[ ], inicio+1, fin);

    8 intercambia(arreglo[inicio], arreglo[i]);

    9 fin_de_funcion;

    Escribe una funcin no recursiva que genere todas las permutaciones de arreglo[ ] desde inicio

    hasta fin, con la misma complejidad que la funcin que se muestra.

    Aplicaciones de Cola

    Problema 1. Implementar un programa qupara administrar una cola.

    Problema 2.Una cola de atencin al pblico, en realidad es un conjunto de colas que son

    atendidas en forma cclica segn determinada prioridad. Esta prioridad puede ser administrada

    inclusive sobre la periodicidad de atencin a cada cola; es decir las colas con mayor prioridad

    pueden atenderse en forma secuencial un cierto nmero de veces (segn el nmero de elementos

    que tengan en ese momento).

    Por otra parte, la cantidad de puntos de atencin puede ser diseada segn los requerimientos. EL

    programa de ser tan flexible que permita configurar todos estos detalles.Esta aplicacin tiene

    como componente principal la interfaz del usuario.

    Problema 3. En tu negocio tienes una secuencia de n sillas acomodas en lnea recta y numeradas

    de 1 a n, por cada persona que se siente en una silla con el nmero x, debers pagar $x al

    gobierno, pero como quieres tener cmodos a los clientes, no tienes otra opcin que pedirles que

    tomen asiento; sin embargo, el aprecio por el cliente an no te ha quitado la codicia, por lo que

    puedes indicarle a cada cliente donde sentarse, pero el cliente deside cuando irse; desde el

    momento que un cliente llega hasta el momento que se va, el cliente pasar todo el tiempo

    sentado en una silla y no estar dispuesto a compartirla con nadie mas. Escribe un programa que

    dado el historial de qu clientes llegan y qu clientes se van en orden cronolgico, calcule que

    asientos asignarles a cada quien para que el dinero que debas pagar al gobierno sea el mnimo

    posible. Tu programa deber funcionar en tiempo lineal.

    Problema de Listas

    Problema 1. Un verdugo es mandado a exterminar a n prisioneros de guerra. El exterminio lo

    ejecuta de la siguiente manera: los prinsioneros forman un crculo al rededor del verdugo, el

    verdugo elige a quien fusilar primero, una vez muerto el primero, el verdugo cuenta, a partir del

    lugar donde estaba su ultima victima, k prisioneros en orden de las manesillas del reloj, y luego

    fusila al k-simo prisionero despues de su ltima vctima (a los muertos no los cuenta), y repite

    este proceso hasta que solo quede un prisionero. El ltimo prisionero podr ser liberado. El

    verdugo tiene un amigo entre los n prisioneros, escribe un programa que dado, n, k y la ubicacin

    de su amigo, le diga a quien fusilar primero, para asegurar que su amigo sea el que quede libre.

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    30

    4. Almacenamiento dinmico

    4.1 Manejo dinmico de la memoria Los punteros

    Cmo se almacena una variable?

    Una computadora opera manipulando direcciones de memoria y los valores almacenados en

    dichas direcciones. Un lenguaje de programacin es una herramienta que permite al programador

    codificar operaciones binarias en un lenguaje ms parecido a nuestro lenguaje natural. Un

    programa que realiza la traduccin de instrucciones desde un lenguaje de programacin dado al

    lenguaje de maquina se llama compilador.

    Una variable es un recurso, entre otros, para manipular un dato binario de modo ms legible. Una

    variable es un identificador de dato, al igual que el nombre de una funcin, este NOMBRE

    representa para la maquina una localidad de memoria donde el programa puede almacenar y

    manipular un dato.

    Una declaracin de variable como:

    char xx=B;

    int nn=25;

    produce una asociacin entre los nombre 'xx', nn y sus correspondientes espacios de

    almacenamiento en memoria. Por lo tanto hay dos elementos relacionados con el nombre de una

    variable: un valor que se puede almacenar all y una direccin de memoria para la variable.

    Existe una correspondencia entre el nombre de cada variable y una direccin de memoria a quien

    representa; es decir, el nombre de la variable propiamente dicha (por ejemplo xx) es solo un

    smbolo grfico que realmente significa una direccin. Esta asociacin podemos representarla

    como una tabla virtual de variables. En consecuencia, esta tabla, luego de las anteriores

    declaraciones y asignaciones, podra tener el siguiente estado:

    Realmente las direcciones de la tabla virtual existen en lo que podramos llamar el espacio real

    de datos, el cual se puede representar como una tabla que podra tener el siguiente estado:

    Nombre de la variable Direccin de memoria

    xx 0012FF8B

    nn 0012FF84

    Direccin de memoria Contenido

    0012FF8B 00000042

    0012FF84 00000019

    B

    25

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    31

    Adems del identificador "xx", tenemos la palabra "char" que nos indica el tipo (type) de la

    variable. El tipo nos indica:

    Cuantas celdas de memoria se reservan para ese nombre de variable; es decir cuantos bytes. Como se interpretarn los bits contenidos en ese espacio o direccin de memoria

    Para el manejo de direcciones y contenidos de variables existen dos operadores: & de direccin y

    * de indireccin.

    Operador de direccion &. El operador (ampersand) & aplicado como prefijo a una variable,

    devuelve la direccin de memoria en la que se encuentra la variable (sea variable normal o

    variable puntero).

    Operador de indireccion *. El asterisco escrito como prefijo de una variable puntero o de una

    direccin de memoria, permite acceder o referirse al contenido de dicho puntero o direccin de

    memoria.

    Por ejemplo:

    &xx : devuelve la direccin en la que se encuentra la variable xx.

    *xx: permite acceder al contenido de la variable xx.

    Entonces, si escribimos: printf("%p \n", &xx); // p formato para punteros

    obtendremos una direccin de memoria como 0012FF8B

    si escribimos: *(&xx) = C;

    estamos almacenando el carcter C en la variable xx. Esta ltima expresin es equivalente a:

    xx = C;

    Por otra parte se sabe que un byte es la menor unidad de informacin que pueden direccionar la

    mayora de las computadoras. En la mayora de las arquitecturas el tipo char ocupa un solo byte.

    Un bool admite solo dos valores diferentes, pero es almacenado como un byte. El tipo int de C++

    ocupa generalmente 2 bytes, un long 4, double 8, y as con el resto de los tipos.

    El otro punto es la relacin entre lo que hay en una celda de memoria y como es interpretado. Lo

    que hay en un celda cuya extensin es un byte es simplemente un conjunto de ocho estados

    posibles (8 bits) que a nivel hardware admiten dos estados diferenciables, estados que pueden ser

    simbolizados como 'verdadero/falso', 0/1, o cualquier otro par de valores.

    As, la variable xx del ejemplo anterior en el espacio de datos, tiene como contenido lo siguiente:

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    32

    Pero que significa este contenido?, Depende en gran medida del tipo (type) que hayamos

    asociado a esa celda (y suponiendo que exista tal asociacin). Ese contenido interpretado como

    un hexadecimal es 0x42, en decimal es 66, y si fue asociado al tipo char (este es el caso del

    ejemplo) representara la letra 'B', cuyo codigo ASCII es igual a 66. En ninguna localidad de

    memoria hay algo como la letra 'B', lo que encontramos son valores binarios que en caso de estar

    asociados a char y en caso de que lo saquemos en pantalla como char har que veamos

    encendidos ciertos pixeles de pantalla, en los cuales reconoceremos una representacin de la letra

    'B'.

    Puesto que la representacin binaria de datos ocupa demasiado espacio, es preferible utilizar el

    sistema hexadecimal, que adems de ser muy fcil de traducir a binario es ms prctico.

    Qu son los punteros?

    Un puntero es un tipo especial de variable, cuyo contenido es el valor de una direccin de

    memoria, esta direccin puede ser la de una variable individual, pero ms frecuentemente ser la

    de un elemento de un arreglo, o una estructura u objeto de una clase. Los punteros, al igual que

    una variable comn, pertenecen a un tipo (type), se dice que un puntero 'apunta a' ese tipo al que

    pertenece.

    Continuando con el ejemplo anterior, declaramos los siguientes punteros

    char *x; // Puntero a char int *n; // Puntero a entero

    x = &xx; // asignamos la direccin de la variable xx al puntero x

    n = &nn; // asignamos la direccin de la variable nn al puntero n

    Luego de las anteriores declaraciones, la tabla virtual de variables podra tener el siguiente

    estado:

    Nombre de la variable Direccin de memoria

    xx 0012FF8B

    nn 0012FF84

    *x 0012FF80

    *n 0012FF7C

    0 0 0 0 0 0 4 2

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    33

    Tambin podemos suponer que el espacio real de datos podra tener el siguiente estado:

    Como se puede ver, un puntero es, en esencia, una variable cuyo contenido es una direccin de

    memoria, que apunta a un tipo dado.

    El siguiente programa en C++, prueba lo explicado en este apartado

    Direccin de memoria Contenido

    0012FF80

    0012FF8B

    0012FF7C

    0012FF84

    0012FF8B 00000042

    0012FF84 00000019

    B

    25

    Apunta a xx

    Apunta a nn

    #include #include

    main()

    { char xx='B';

    int nn=25; char *x;

    int *n;

    x = &xx; n = &nn;

    printf("TABLA DE VARIABLES\n\n");

    printf(" Variable Direccion \n\n"); printf("%15s ", "xx"); printf("%15p \n", &xx);

    printf("%15s ", "nn"); printf("%15p \n", &nn);

    printf("%15s ", "*x"); printf("%15p \n", &x);

    printf("%15s ", "*n"); printf("%15p \n", &n);

    printf("\n\n\nESPACIO DE DATOS\n\n");

    printf(" Direccion Contenido Comentario\n\n"); printf("%15p ", &xx); printf("%15p ", xx); printf(" %-15c \n", xx);

    printf("%15p ", &nn); printf("%15p ", nn); printf(" %-15i \n", nn);

    printf("%15p ", &x); printf("%15p ", x); printf(" %-15s \n", "apunta a xx"); printf("%15p ", &n); printf("%15p ", n); printf(" %-15s \n", "apunta a nn");

    getchar();

    }

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    34

    Independientemente del tamao (sizeof en C++) del objeto apuntado, el valor almacenado por el

    puntero ser el de una nica direccin de memoria. En sentido estricto un puntero no puede

    almacenar la direccin de memoria de un arreglo (completo), sino la de un elemento del arreglo,

    y por este motivo no existen diferencias sintcticas entre punteros a elementos individuales y

    punteros a arrays. La declaracin de un puntero a un tipo char y otro a un arreglo de char es

    igual.

    Al definir variables o arreglos hemos visto que el tipo (type) modifica la cantidad de bytes que se

    usaran para almacenar tales elementos, as un elemento de tipo 'char' utiliza 1 byte, y un entero 2

    o 4. No ocurre lo mismo con los punteros, el tipo no influye en la cantidad de bytes asociados al

    puntero, pues todas las direcciones de memoria se pueden expresar con solo 2 bytes (o 4 si es una

    direccin de otro segmento)

    La forma general de declarar un puntero es la siguiente:

    Ejemplos:

    int * pe // pe es un puntero a un entero

    float *f // f es un puntero a float

    TMatriz *m // m es un puntero a un objeto de la clase TMatriz.

    int **t // t es un puntero a un puntero que apunta a entero

    TRacional *r // r es un puntero a objetos de la clase TRacional

    4.2. Listas encadenadas

    Una estructura de datos muy utilizada en programacin es la lista encadena (editores de texto,

    compiladote, interfaces de bases de datos, etc.). En C++, es posible crear clases que representen a

    listas encadenadas y que facilitarn la gestin de estas listas.

    Una lista encadenada consta de nodos que se pueden almacenar en cualquier parte de la memoria

    del sistema. Cada nodo contiene los datos asociados con el nodo y la direccin o puntero del

    siguiente nodo. La siguiente figura muestra la estructura lgica de la lista encadenada.

    TipoDeDato *NombrePuntero

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    35

    Dato Link

    Donde Head representa el comienzo de la lista

    Una lista encadenada se puede implementar mediante arreglos, esta manera de implementacin

    de listas basadas en arreglos funcionan bien para listas estticas, sin embargo tiene algunas

    desventajas importantes:

    Alta volatilidad de datos. No resultan eficientes para listas dinmicas en las que continuamente se estn aadiendo y eliminando elementos.

    Procesos lentos. La razn es que, en general, para insertar o eliminar un elemento de la lista tenemos que desplazar otros elementos.

    Cantidad limitada de datos. Existen problemas de programacin en los cuales no se conocen con anticipacin la cantidad mxima de elementos a insertar a la lista.

    Los procesos de insercin eliminacin en las listas estticas requieren recorrer gran parte de los datos y modificar su posicin de todos los elementos causando un retraso en el

    procesamiento

    La mayora de estas desventajas pueden ser superadas utilizando listas implementadas con

    punteros; es decir manejando dinmicamente la memoria.

    4.3 Diseo e implementacin dinmica de listas encadenadas

    Para implementar una lista encadena mediante punteros, es necesario definir el concepto de nodo,

    en base al cual se definir la lista encadenada.

    Estructura de Nodo

    Un nodo es una estructura en memoria dividida en al menos dos campos:

    Un campo para almacenar la

    ddiirreecccciinn ddee

    mmeemmoorriiaa ddeell

    ssiigguuiieennttee nnooddoo de informacin si este existe

    Un campo para los datos (de cualquier tipo) que contienen la informacin o elementos que conforman la lista

    Dato Null

    Dato Dato Link

    El Campo de enlace link proporciona la direccin o referencia del siguiente nodo de la lista

    En caso de que un nodo sea nodo terminal, se representa como Null, cero o un smbolo de tierra

    NODO

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    36

    Una posible implementacin en C++ de un nodo es la siguiente:

    Estructura de Lista encadenada

    Una lista encadenada o lista enlazada es una coleccin de elementos nodos, en donde cada uno

    contiene datos y un enlace o link al siguiente nodo de la lista

    Para acceder a los elementos de la lista encadenada basta conocer la direccin de memoria del

    primer nodo.

    Esquema y diseo de una lista enlazada

    Dependiendo de donde se aplique la lista enlazada se pueden optar por diversos diseos de

    acuerdo a las necesidades del problema en particular a continuacin mostraremos algunos de los

    diseos mas utilizados

    a) Con un solo puntero

    Link Dato Link Dato Link Dato

    L

    class nodo { public: char dato; nodo *link; nodo() { dato = ' '; link = NULL; } void imprimir(); // void poner(char valor); // char obtener(); };

    El programa completo se puede ver en clase lista)

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    37

    Para agregar un elemento o llegar al ltimo elemento de la lista se tiene que navegar toda la lista

    desde el inicio, este hecho se considera como una desventaja ya que representa una tardanza en el

    hecho de navegar secuencialmente de nodo a nodo

    b) Con dos punteros

    Mejora el inconveniente anterior pero ocupa ms espacio para almacenar el puntero al ltimo

    nodo. Si se requiere conocer la cantidad de elementos se tendra que navegar y contar los

    elementos (Mucho proceso para algo que puede ser ms simple) este hecho se considera como

    una desventaja.

    Ultimo

    F

    Primero L

    Link Dato Link Dato Link Dato

    Primero

    Link Dato Link Dato Link Dato

    class lista { private : nodo *L; // apunta al comienzo de la lista nodo *F; // apunta al final de la lista int tam; public: lista() { L = NULL; tam = 0; } void tamano(); void anadirFin(char c); void anadirIni(char c); void recorrer(); void insertar(int u, char c);

    // inserta c despues de la posicin u. // Si excede el tamao actual inserta al final void eliminar(int u); // elimina de la posicin u }; El programa completo se puede ver en clase lista)

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    38

    c) Con dos punteros y un campo tamao

    Mejora el diseo anterior manteniendo un campo (tamao) actualizado en todos los procesos de

    insercin y eliminacin que permita almacenar la cantidad de nodos de la lista, de modo que el

    hecho de conocer la cantidad de nodos no sera ms que una simple devolucin de esta variable

    actualizada en todas las operaciones que modifiquen la cantidad de nodos de la lista.

    Definicin de operaciones

    Las principales operaciones que podemos realizar sobre la lista encadenada simple son:

    RReeccoorrrriiddoo IInnsseerrcciinn BBoorrrraaddoo BBssqquueeddaa

    Operacin de Recorrido

    Consiste en visitar cada uno de los nodos que forman la lista. Se comienza con el primero, se

    toma el valor del campo Link para avanzar al segundo nodo, as sucesivamente.

    Cuando se encuentre un link = Null se habr terminado de recorrer la lista

    L

    P

    55 22 99 77

    Tamao = 3 Ultimo Primero

    Link 23 Link 60 Link 90

    55

    L

    22 99

    00 77

    P

    Fx

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    39

    Utilizando una variable auxiliar P que se inicia en L y desde ah se comienza a navegar de nodo en nodo utilizando el Link de cada uno de ellos. El hecho de utilizar un puntero auxiliar es para

    no alterar el valor del puntero L ya que si se altera se puede perder la direccin de toda la lista enlazada.

    Operacin de Insercin

    Consiste en insertar un nodo a cualquier parte de la lista, esto se realiza mediante asignacin

    dinmica de memoria es decir que se reserva memoria para un nuevo nodo y luego se almacena

    en l el dato para enlazarlo a la lista en el lugar deseado ya sea al principio de la lista, al final o

    entre medio de la lista. En cualquiera de los casos se deben actualizar los punteros de los nodos

    adyacentes para mantener la lista enlazada.

    El proceso se realiza en cuatro pasos, dada una lista como la que muestra a continuacin:

    1) Se crea un nuevo nodo, al cual se le asigna un dato:

    2) Se recorre la lista hasta el lugar de insercin, mediante un puntero P:

    3) Se copia el campo link del nodo apuntado por P, al campo link del nuevo nodo N:

    55

    L

    22 99 77

    55

    L

    22 99 77

    P

    55

    L

    22 99 77

    P 4

    N

    44

    N

  • Apuntes de Estructuras de datos SASCI Rodolfo Arana Gonzales

    40

    4) Por ltimo, se copia en el campo link del nodo apuntado por P, el puntero N del nuevo nodo:

    Operacin de Borrado

    Consiste en eliminar un nodo de lista enlazada, en este caso se debe actualizar las direcciones de

    los punteros necesarios y liberar la memoria ocupada por el nodo al sistema operativo para que

    pueda ser utilizado en otras operaciones.

    Operacin de Bsqueda

    Consiste en buscar un elemento cualquiera en la lista enlazada, este hecho se realiza recorriendo

    la lista y comparando el dato de cada uno de los nodos visitados con el elemento que se est

    buscando hasta que se lo encuentre. Es similar a la operacin de recorrido.

    4.4. Implementacin dinmica de estructuras de datos

    Las estructuras de datos dinmicas como son las pilas y las colas son mejor implementadas

    mediante el manejo dinmico de memoria, a travs de punteros.

    Implementacin de pilas con punteros

    Utilizando la estructura nodal de un