Clase 15 Vilca PDF
Clase 15 Vilca PDF
Clase 15 Vilca PDF
Computador
EE-150
Definir una pila, las operaciones básicas en las pilas, sus aplicaciones y cómo
se pueden implementar.
Definir una cola, las operaciones básicas de las colas, sus aplicaciones y cómo
se pueden implementar.
Definir una lista lineal general, las operaciones básicas en las listas, sus
aplicaciones y cómo se pueden implementar.
12.3
12-1 LA IDEA DE FONDO
12.4
ADTs simples
Muchos lenguajes de programación ya definen algunos ADT
simples como partes integrales del lenguaje. Por ejemplo, el
lenguaje C define un ADT simple como un número entero.
El tipo de este ADT es un entero con rangos predefinidos. C
también define varias operaciones que pueden aplicarse a
este tipo de datos (suma, resta, multiplicación, división, etc.).
C define explícitamente estas operaciones en enteros y lo que
esperamos como resultados. Un programador que escribe un
programa en C para agregar dos enteros debe conocer el
ADT entero y las operaciones que se le pueden aplicar.
12.5
ADTs complejos
Aunque se han implementado varios ADT simples, como
enteros, reales, caracteres, punteros, etc., y están disponibles
para su uso en la mayoría de los idiomas, muchos ADT
complejos útiles no lo están. Como veremos en este capítulo,
necesitamos una lista ADT, una pila ADT, una cola ADT y
así sucesivamente. Para ser eficientes, estos ADT deben
crearse y almacenarse en la biblioteca de la computadora que
se utilizará.
i
El concepto de abstracción significa:
1. Sabemos lo que puede hacer un tipo de datos.
2. Se oculta cómo se hace.
12.6
Definición
Definamos ahora un ADT. Un tipo de datos abstracto es un
tipo de datos empaquetado con las operaciones que son
significativas para el tipo de datos. Luego, encapsulamos los
datos y las operaciones en los datos y los ocultamos al
usuario.
i
Tipo de datos abstractos:
1. Definición de los datos.
2. Definición de operaciones.
3. Encapsulación de datos y funcionamiento.
12.7
Modelo para un tipo de datos abstracto
El modelo ADT se muestra en la Figura 12.1. Dentro del
ADT hay dos partes diferentes del modelo: estructura de
datos y operaciones (públicas y privadas).
12.9
12-2 PILAS
12.14
Stack ADT
Definimos un stack como un ADT tal como se muestra a
continuación:
12.15
Ejemplo 12.1
12.17
Ejemplo 12.2
En el Capítulo 2 (Figura 2.6 en la página 27) proporcionamos un
simple diagrama UML para convertir un número entero de decimal
a cualquier base. Aunque el algoritmo es muy simple, si
imprimimos los dígitos del número entero convertido a medida que
se crean, obtendremos los dígitos en orden inverso. La instrucción
de impresión en cualquier lenguaje de computadora imprime
caracteres de izquierda a derecha, pero el algoritmo crea los dígitos
de derecha a izquierda. Podemos usar la característica de inversión
de una pila (estructura LIFO) para resolver el problema.
El algoritmo 12.1 muestra el pseudocódigo para convertir un entero
decimal a binario e imprimir el resultado. Primero creamos una pila
vacía. Luego usamos un bucle while para crear los bits, pero en
lugar de imprimirlos, los colocamos en la pila. Cuando todos los
bits son creados, salimos del bucle. Ahora usamos otro bucle para
sacar los bits de la pila e imprimirlos. Tenga en cuenta que los bits
se imprimen en el orden inverso al que se han creado.
12.18
Ejemplo 12.2 (continúa…)
12.19
Ejemplo 12.2 (…continuación)
12.20
Emparejamiento de elementos de datos
A menudo necesitamos emparejar algunos caracteres en una
expresión. Por ejemplo, cuando escribimos una expresión
matemática en un lenguaje de computadora, a menudo
necesitamos usar paréntesis para cambiar la precedencia de los
operadores. Las siguientes dos expresiones se evalúan de manera
diferente debido a los paréntesis en la segunda expresión:
12.22
Example 12.3 (…continuación)
12.23
Implementación de la pila
En el nivel ADT, usamos la pila y sus cuatro operaciones; a
nivel de implementación, necesitamos elegir una estructura de
datos para implementarla. Los ADT de pila se pueden
implementar utilizando un arreglo o una lista enlazada. La
figura 12.7 muestra un ejemplo de una pila ADT con cinco
elementos. La figura también muestra cómo podemos
implementar la pila.
En nuestra implementación de arreglo, tenemos un registro que
tiene dos campos. El primer campo se puede utilizar para
almacenar información sobre el arreglo. La implementación de
la lista vinculada es similar: tenemos un nodo adicional que
tiene el nombre de la pila. Este nodo también tiene dos
campos: un contador y un puntero que apunta al elemento
superior.
12.24
Figura 12.7 Implementaciones de pila
12.25
12-3 COLAS
12.30
Cola ADT
Definimos una cola como un ADT como se muestra a
continuación:
12.31
Ejemplo 12.4
12.33
Ejemplo 12.5
Las colas pueden usarse para organizar bases de datos por alguna
característica de los datos. Por ejemplo, imagine que tenemos una
lista de datos ordenados almacenados en la computadora que
pertenecen a dos categorías: menos de 1000 y más de 1000.
Podemos usar dos colas para separar las categorías y al mismo
tiempo mantener el orden de los datos en sus categoría propia. El
algoritmo 12.3 muestra el pseudocódigo para esta operación.
12.34
Ejemplo 12.5 (continúa…)
12.35
Ejemplo 12.5 (…continuación)
12.36
Ejemplo 12.6
Otra aplicación común de una cola es ajustar y crear un equilibrio
entre un productor rápido de datos y un consumidor lento de
datos. Por ejemplo, suponga que una CPU está conectada a una
impresora. La velocidad de una impresora no es comparable con
la velocidad de una CPU. Si la CPU espera a que la impresora
imprima algunos datos creados por la CPU, la CPU estará
inactiva durante mucho tiempo. La solución es una cola. La CPU
crea tantos trozos de datos como la cola puede contener y los
envía a la cola. La CPU ahora es libre de hacer otros trabajos. Los
trozos se retiran lentamente e imprimen en la impresora. La cola
utilizada para este propósito se conoce normalmente como una
cola de cola de impresión.
12.37
Implementación de la cola
En el nivel ADT, usamos la cola y sus cuatro operaciones en el
nivel de implementación. Necesitamos elegir una estructura de
datos para implementarla. Una cola ADT se puede implementar
utilizando un arreglo o una lista enlazada. La Figura 12.13 en
la página 329 muestra un ejemplo de una cola ADT con cinco
elementos. La figura también muestra cómo podemos
implementarla. En la implementación de arreglo tenemos un
registro con tres campos. El primer campo se puede utilizar
para almacenar información sobre la cola.
La implementación de la lista enlazada es similar:
tenemos un nodo adicional que tiene el nombre de la cola. Este
nodo también tiene tres campos: una cuenta, un puntero que
apunta al elemento frontal y un puntero que apunta al elemento
posterior.
12.38
Figura 12.13 Implementación de la cola
12.39
12-4 LISTAS LINEALES GENERALES
12.41
La operación insert
Como suponemos que los datos en una lista lineal general están
ordenados, la inserción debe hacerse de tal manera que se
mantenga el orden de los elementos. Para determinar dónde se
colocará el elemento, se necesita buscar. Sin embargo, la
búsqueda se realiza en el nivel de implementación, no en el
nivel ADT.
12.45
La operación empty
La operación empty comprueba el estado de la lista. A
continuación se muestra el formato:
12.46
Lista lineal general ADT
Definimos una lista lineal general como un ADT como se
muestra a continuación:
12.47
Ejemplo 12.7
La Figura 12.18 muestra un segmento de un algoritmo que aplica
las operaciones previamente definidas en una lista L. Tenga en
cuenta que la tercera y quinta operación insertan los nuevos datos
en la posición correcta, porque la operación de inserción llama al
algoritmo de búsqueda en el nivel de implementación para
encontrar dónde Los nuevos datos deben ser insertados. La cuarta
operación no elimina el elemento con el valor 3 porque no está en
la lista.
12.48
Figura 12. 18 Ejemplo 12.7
Aplicaciones de la lista lineal general
Las listas lineales generales se utilizan en situaciones en las
que se accede a los elementos de forma aleatoria o
secuencial. Por ejemplo, en una universidad se puede usar
una lista lineal para almacenar información sobre los
estudiantes que están matriculados en cada semestre.
12.49
Ejemplo 12.8
Supongamos que una universidad tiene una lista lineal general
que contiene información sobre los estudiantes y que cada
elemento de datos es un registro con tres campos: ID, Nombre y
Nota. El algoritmo 12.4 muestra un algoritmo que ayuda a un
profesor a cambiar la calificación de un estudiante. La operación
de eliminación elimina un elemento de la lista, pero lo pone a
disposición del programa para permitir que se cambie la
calificación. La operación de inserción inserta el elemento
modificado de nuevo en la lista. El elemento contiene todo el
registro para el estudiante, y el objetivo es la ID utilizada para
buscar en la lista.
12.50
Ejemplo 12.8 (continúa…)
12.51
Example 12.9
Continuing with Example 12.8, assume that the tutor wants to
print the record of all students at the end of the semester.
Algorithm 12.5 can do this job. We assume that there is an
algorithm called Print that prints the contents of the record. For
each node, the list traverse calls the Print algorithm and passes
the data to be printed to it.
12.52
Ejemplo 12.9 (…continuación)
12.53
Implementación de la lista lineal general
A nivel de ADT, utilizamos la lista y sus seis operaciones,
pero a nivel de implementación necesitamos elegir una
estructura de datos para implementarla. Una lista general de
ADT se puede implementar utilizando un arreglo o una lista
enlazada. La figura 12.19 muestra un ejemplo de una lista
ADT con cinco elementos. La figura también muestra cómo
podemos implementarla.
12.54
Figura 12.19 Implementación de la lista lineal general
12.55
12-5 ÁRBOLES
12.57
Cada nodo en un árbol puede tener un sub-árbol. El
subárbol de cada nodo incluye uno de sus hijos y todos los
descendientes de ese niño. La Figura 12.21 muestra todos los
subárboles para el árbol en la Figura 12.20.
12.60
La Figura 12.23 muestra ocho árboles, el primero de los
cuales es un árbol binario vacío (a veces llamado árbol
binario nulo).
12.62
Recorridos de árboles binarios
Un recorrido de árbol binario requiere que cada nodo del
árbol se procese una vez y solo una vez en una secuencia
predeterminada. Los dos enfoques generales de la secuencia
transversal son recorrido en profundidad-primero depth-first
y amplitud-primero breadth-first.
Codificación Huffman
La codificación de Huffman es una técnica de compresión
que utiliza árboles binarios para generar un código binario de
longitud variable a partir de una cadena de símbolos.
Discutimos la codificación de Huffman en detalle en el
Capítulo 15.
12.66
Árboles de expresión
Una expresión aritmética se puede representar en tres
formatos diferentes: infijo, posfijo and prefijo. En una
notación de infijo, el operador se encuentra entre los dos
operandos. En la notación postfix, el operador viene después
de sus dos operandos, y en la notación prefijo aparece antes
de los dos operandos. Estos formatos se muestran a
continuación para agregar dos operandos A y B.
12.67
Figura 12.27 Árbol de expresión
12.68
12-7 ÁRBOLES DE BÚSQUEDA BINARIA
i
Un recorrido en orden de un BST crea una lista que
está ordenada en orden ascendente
12.71
Otra característica que hace que una BST sea interesante es
que podemos usar una versión de la búsqueda binaria que
usamos en el Capítulo 8 para un árbol de búsqueda binaria.
La Figura 12.30 muestra el UML para una búsqueda BST.
12.73
Implementación de un BST
Los BST se pueden implementar utilizando matrices o listas
vinculadas. Sin embargo, las estructuras de listas enlazadas
son más comunes y más eficientes. La implementación
utiliza nodos con dos punteros, izquierdo y derecho.