En este módulo, exploraremos las estructuras de datos dinámicas en ALGOL. Las estructuras de datos dinámicas son aquellas que pueden cambiar de tamaño durante la ejecución del programa, lo que las hace muy útiles para una variedad de aplicaciones donde el tamaño de los datos no es conocido de antemano.
Conceptos Clave
- Memoria Dinámica: La capacidad de asignar y liberar memoria durante la ejecución del programa.
- Listas Enlazadas: Una estructura de datos donde cada elemento (nodo) contiene un valor y un puntero al siguiente nodo.
- Pilas y Colas: Estructuras de datos que siguen el principio LIFO (Last In, First Out) y FIFO (First In, First Out), respectivamente.
- Árboles: Estructuras jerárquicas donde cada nodo tiene un valor y punteros a nodos hijos.
Memoria Dinámica en ALGOL
ALGOL permite la asignación dinámica de memoria mediante el uso de punteros. A continuación, se muestra cómo se puede declarar y utilizar un puntero en ALGOL:
begin integer pointer p; integer array a[1:10]; p := new integer array[1:10]; p[1] := 5; p[2] := 10; ! Liberar memoria dispose p; end;
Explicación del Código
integer pointer p;
: Declara un punterop
que puede apuntar a un entero.p := new integer array[1:10];
: Asigna memoria para un arreglo de 10 enteros y hace quep
apunte a este arreglo.p[1] := 5;
: Asigna el valor 5 al primer elemento del arreglo.dispose p;
: Libera la memoria asignada al arreglo.
Listas Enlazadas
Las listas enlazadas son una de las estructuras de datos dinámicas más comunes. Cada nodo en una lista enlazada contiene un valor y un puntero al siguiente nodo.
Ejemplo de Lista Enlazada en ALGOL
begin record node( integer value; ref(node) next; ); ref(node) head, temp; ! Crear el primer nodo head := new node; head.value := 10; head.next := nil; ! Crear el segundo nodo temp := new node; temp.value := 20; temp.next := nil; head.next := temp; ! Imprimir los valores de la lista temp := head; while temp /= nil do begin print(temp.value); temp := temp.next; end; end;
Explicación del Código
record node
: Define un registronode
con un enterovalue
y un punteronext
al siguiente nodo.ref(node) head, temp;
: Declara dos punteros a nodos,head
ytemp
.head := new node;
: Asigna memoria para el primer nodo y hace quehead
apunte a él.head.value := 10;
: Asigna el valor 10 al primer nodo.temp := new node;
: Asigna memoria para el segundo nodo y hace quetemp
apunte a él.head.next := temp;
: Hace que el primer nodo apunte al segundo nodo.while temp /= nil do
: Itera a través de la lista e imprime los valores de cada nodo.
Pilas y Colas
Pila (Stack)
Una pila sigue el principio LIFO (Last In, First Out). A continuación se muestra un ejemplo de implementación de una pila en ALGOL:
begin record stackNode( integer value; ref(stackNode) next; ); ref(stackNode) top; procedure push(integer val); begin ref(stackNode) newNode; newNode := new stackNode; newNode.value := val; newNode.next := top; top := newNode; end push; integer procedure pop(); begin integer val; if top /= nil then begin val := top.value; top := top.next; end; pop := val; end pop; ! Uso de la pila push(10); push(20); print(pop()); ! Imprime 20 print(pop()); ! Imprime 10 end;
Explicación del Código
record stackNode
: Define un nodo de la pila con un valor y un puntero al siguiente nodo.ref(stackNode) top;
: Declara un punterotop
que apunta al nodo superior de la pila.procedure push(integer val);
: Define el procedimientopush
para agregar un valor a la pila.integer procedure pop();
: Define el procedimientopop
para eliminar y devolver el valor superior de la pila.
Cola (Queue)
Una cola sigue el principio FIFO (First In, First Out). A continuación se muestra un ejemplo de implementación de una cola en ALGOL:
begin record queueNode( integer value; ref(queueNode) next; ); ref(queueNode) front, rear; procedure enqueue(integer val); begin ref(queueNode) newNode; newNode := new queueNode; newNode.value := val; newNode.next := nil; if rear /= nil then rear.next := newNode; else front := newNode; rear := newNode; end enqueue; integer procedure dequeue(); begin integer val; if front /= nil then begin val := front.value; front := front.next; if front = nil then rear := nil; end; dequeue := val; end dequeue; ! Uso de la cola enqueue(10); enqueue(20); print(dequeue()); ! Imprime 10 print(dequeue()); ! Imprime 20 end;
Explicación del Código
record queueNode
: Define un nodo de la cola con un valor y un puntero al siguiente nodo.ref(queueNode) front, rear;
: Declara dos punterosfront
yrear
que apuntan al primer y último nodo de la cola, respectivamente.procedure enqueue(integer val);
: Define el procedimientoenqueue
para agregar un valor a la cola.integer procedure dequeue();
: Define el procedimientodequeue
para eliminar y devolver el valor del primer nodo de la cola.
Árboles
Los árboles son estructuras jerárquicas donde cada nodo tiene un valor y punteros a nodos hijos. Un tipo común de árbol es el árbol binario, donde cada nodo tiene como máximo dos hijos.
Ejemplo de Árbol Binario en ALGOL
begin record treeNode( integer value; ref(treeNode) left, right; ); ref(treeNode) root; procedure insert(ref(treeNode) node, integer val); begin if node = nil then begin node := new treeNode; node.value := val; node.left := nil; node.right := nil; end else if val < node.value then insert(node.left, val) else insert(node.right, val); end insert; procedure inorder(ref(treeNode) node); begin if node /= nil then begin inorder(node.left); print(node.value); inorder(node.right); end; end inorder; ! Uso del árbol binario insert(root, 10); insert(root, 5); insert(root, 15); inorder(root); ! Imprime 5, 10, 15 end;
Explicación del Código
record treeNode
: Define un nodo del árbol con un valor y punteros a los nodos izquierdo y derecho.ref(treeNode) root;
: Declara un punteroroot
que apunta a la raíz del árbol.procedure insert(ref(treeNode) node, integer val);
: Define el procedimientoinsert
para agregar un valor al árbol.procedure inorder(ref(treeNode) node);
: Define el procedimientoinorder
para realizar un recorrido en orden del árbol.
Ejercicio Práctico
Ejercicio
Implementa una lista enlazada en ALGOL que permita insertar elementos al final de la lista y recorrerla para imprimir todos sus valores.
Solución
begin record node( integer value; ref(node) next; ); ref(node) head, temp; procedure append(integer val); begin ref(node) newNode; newNode := new node; newNode.value := val; newNode.next := nil; if head = nil then head := newNode else begin temp := head; while temp.next /= nil do temp := temp.next; temp.next := newNode; end; end append; procedure printList(); begin temp := head; while temp /= nil do begin print(temp.value); temp := temp.next; end; end printList; ! Uso de la lista enlazada append(10); append(20); append(30); printList(); ! Imprime 10, 20, 30 end;
Explicación del Código
procedure append(integer val);
: Define el procedimientoappend
para agregar un valor al final de la lista.procedure printList();
: Define el procedimientoprintList
para recorrer e imprimir los valores de la lista.
Conclusión
En esta sección, hemos explorado las estructuras de datos dinámicas en ALGOL, incluyendo listas enlazadas, pilas, colas y árboles. Estas estructuras son fundamentales para manejar datos de manera eficiente y flexible. Asegúrate de practicar los ejemplos y ejercicios proporcionados para consolidar tu comprensión de estos conceptos. En el próximo módulo, profundizaremos en el manejo de archivos en ALGOL.
Curso de Programación en ALGOL
Módulo 1: Introducción a ALGOL
- ¿Qué es ALGOL?
- Historia y Evolución de ALGOL
- Configuración del Entorno ALGOL
- Primer Programa en ALGOL
Módulo 2: Sintaxis y Estructura Básica
- Estructura del Programa ALGOL
- Variables y Tipos de Datos
- Entrada y Salida Básica
- Operadores y Expresiones
Módulo 3: Estructuras de Control
Módulo 4: Funciones y Procedimientos
- Definición de Funciones
- Parámetros de Función y Valores de Retorno
- Funciones Recursivas
- Procedimientos en ALGOL
Módulo 5: Estructuras de Datos
Módulo 6: Temas Avanzados
Módulo 7: Aplicaciones Prácticas
- Métodos Numéricos
- Implementación de Algoritmos
- Construcción de un Compilador Simple
- Estudios de Caso y Proyectos