Está en la página 1de 86

Estructura de Datos

Ing. Orlin Pinto


Correo: orlin.garcia@uth.hn
Cel: +504 3340-6665
"No podemos estar en modo de
supervivencia. Tenemos que
estar en modo de crecimiento".
Jeff Bezos.
Objetivo
Conocer y aplicar las técnicas
avanzadas de programación orientada
a objetos para la representación
dinámica de datos en memoria y disco,
aplicando las técnicas de
ordenamiento y búsqueda que
permiten la optimización de recursos
mediante el desarrollo de sistemas
formales y complejos, utilizando las
estructuras de datos estáticas y
dinámicas.
Objetivos Específicos
1.Desarrollar aplicaciones formales de amplio alcance.
2.Aplicar soluciones de programación orientada a objetos
para el manejo dinámico de la memoria.
3.Optimizar la utilización de recursos en la creación de
soluciones o programas.
4.Describir las diferentes estructuras de datos.
5.Describir los métodos de ordenamiento más utilizados.
6.Describir los métodos de búsqueda más utilizados.
Forma Evaluativa del Cuatrimestre

Primer Parcial Segundo Parcial Tercer Parcial


20% 35% 45%

Tareas10% Tareas20% Examen Tareas30% Examen


Examen 10% 15% 15%
Fecha
Descripción Observación Entrega Valor
28 de
Tarea 1 Investigación enero 1
11 de
Tarea 2 Ejercicios con arreglos Febrero 2

15 de
Tarea 3 Ejercicios de programación Febrero 2

Proyecto Durante la clase se les dará a conocer 5


Examen Por medio de Canvas 10

Total 20
Referencias bibliográficas:

Joyanes, L. (2007). ESTRUCTURA DE DATOS EN C++. McGraw-Hill


España.
https://elibro.net/es/ereader/uthonduras/50123?page=1

Joyanes Aguilar, L. (2006). Programación en C++: algoritmos,


estructuras de datos y objetos (2a. ed.). McGraw-Hill España.
https://elibro.net/es/ereader/uthonduras/50088?page=1

Deitel, H. M. y M. Deitel, H. (2009). Cómo programar en C++


(6a. ed.). Pearson Educación.
https://elibro.net/es/ereader/uthonduras/74158?page=1
Introducción a las Estructuras de datos

Datos son los hechos que


describen sucesos y
entidades."Datos" es una
palabra en plural que se
refiere a más de un hecho. A
un hecho simple se le
denomina "data-ítem" o
elemento de dato
Tipos de Datos Abstractos TDA

Datos son los hechos que


describen sucesos y
entidades."Datos" es una
palabra en plural que se
refiere a más de un hecho. A
un hecho simple se le
denomina "data-ítem" o
elemento de dato
Introducción a las Estructuras de datos
Se puede pensar en un "tipo de dato
abstracto" (TDA) como en un modelo
matemático con una serie de operaciones
definidas en ese modelo
Formas de Almacenamiento
Las formas de asignación de memoria
cuando se hace uso de las Estructuras de
Datos, en tal caso, se puede mencionar
dos tipos de almacenamiento: Estático y
Dinámico.
Estructuras de Datos Estáticas y Dinámicas
Tipo de Dato Estático
Son aquellas en las que
el tamaño ocupado en
memoria se define antes 1.Enteros
2.Reales
de que el programa se
3.Caracteres
ejecute y no puede 4.Boléanos
modificarse dicho 5.Enumerados
tamaño durante la 6.Subrangos
ejecución del programa
Tipo de Datos Dinámicos
Aquella en la que el tamaño 1.Lineales:
ocupado en memoria se • Pilas
define antes de que el • Colas
programa se ejecute y no • Listas Enlazadas
pueda modifcarse dicho 2.No Lineales:
• Arboles
tamaño durante la ejecucion
• Grafos
del programa entre las
estructuras de datos estaticas
se encuentran en los array
(vectores y matrices),
registros, archivos y cadenas.
Arreglos
Un arreglo es un conjunto de variables que son del mismo
tipo de datos. A cada parte de un arreglo se le denomina
"elemento". Los cuales se hacen referencia con el mismo
nombre y se almacenan en posiciones consecutivas.
Arreglos
Ordenamiento de Arreglos
Su finalidad es organizar ciertos datos (normalmente arreglos o archivos) en un
orden creciente o decreciente, mediante una regla prefijada (numérica, alfabética,
...) .
Dependiendo al tipo de elemento que se quiera ordenar puede ser:

Ordenación interna: Los datos se encuentran en


memoria (ya sean arreglos, listas, etc.), y son de
acceso aleatorio o directo (se puede acceder a un
determinado campo sin pasar por los anteriores).

Ordenación externa: Los datos están en un


dispositivo de almacenamiento externo (archivos), y
su ordenación es más lenta que la interna
Arreglos
Método Burbuja
Este método consiste en
acomodar el vector moviendo el
mayor hasta la ultima casilla ,
comenzando desde la casilla
cero del vector hasta a ver
acomodado el número mas
grande en la ultima posición, una
vez acomodado el mas grande,
prosigue a encontrar y acomodar
el siguiente más grande
comparando de nuevo los
números desde el inicio del
vector y asi sigue hasta ordenar
todos los elementos de todo el
arreglo.
Arreglos
Método Quick Sort

El método Quick Sort es


actualmente el mas eficiente y
veloz de los método de
ordenación interna. Es tambien
conocido con el nombre del
método rápido y de
ordenamiento por partición.
Arreglos
Selección Directa Algoritmo
Consiste en buscar el menor Seleccion (A,N)
elemento del arreglo y colocarlo 1 Repetir con l desde 1 hasta N-1
en la primera posición. Luego se Hacer MENOR=A[l] y K=l
busca el segundo elemento mas
pequeño del arreglo y se coloca 1.1 Repetir con J desde l + 1 hasta N
en la segunda posición. El
proceso continua hasta que 1.1.1 Si (A[J]<MENOR) entonces
todos los elementos del arreglo Hacer MENOR =A[J] y K=J
han sido ordenados.
1.1.2 Fin del condicional (1.1.1)
Principios
1.- Seleccionar el menor 1.2 Fin del ciclo(1.1)
elemento del arreglo.
2.- Intercambiar dicho elemento Hacer A[K] = A[l] y A[l]=MENOR
con el primero.
3.- Repetir los pasos anteriores 2..-Fin del ciclo (1)
con los (n-1), (n-2) elementos y
asi sucesivamente hasta que
solo quede el elemento mayor.
Arreglos
Otras menciones de ordenamientos
Método de Monticulo Inserción Simple Método Shell

El Shell sort es una


Este método es mas Es una manera muy generalización
eficiente que los natural de ordenar para del ordenamiento por
métodos de ordenación un ser humano, y puede insercion:
que trabaja con árboles. usarse fácilmente para 1.El ordenamiento por
La idea central de este ordenar un mazo de inserción es eficiente si
algoritmo consiste en: cartas numeradas en la entrada está "casi
1.- Construir un forma arbitraria. ordenada".
montículo. Requiere operaciones 2.El ordenamiento por
2.- Eliminar la raíz del para ordenar una lista inserción es ineficiente,
montículo en forma de n elementos. en general, porque
repetida. mueve los valores sólo
una posición cada vez.
Arreglos
Algoritmos de Búsqueda
Un algoritmo de búsqueda es aquel
que está diseñado para localizar un
elemento con ciertas propiedades
dentro de una estructura de datos; por
ejemplo, ubicar el registro
correspondiente a cierta persona en
una base de datos, o el mejor
movimiento en una partida de ajedrez.

La variante más simple del problema


es la búsqueda de un número en
un vector.
Tipos de Arreglos
Arreglos Unidimensionales Arreglos Bidimensionales
Un arreglo de una dimensión es una Es una estructura de datos estática y de
lista de variables, todas de un mismo un mismo tipo de datos, y de longitud
tipo a las que se hace referencia por fija que almacena datos de forma
medio de un nombre común. matricial. De igual forma que los
arreglos unidimensionales, el
Para declarar un arreglo de una sola almacenamiento de los datos en la
dimensión se usa el siguiente formato: memoria se realiza de forma secuencial
y son accedidos mediante índices.
tipo de dato + La sintaxis es la siguiente:
identificador[tamaño];
tipo de dato + identificador
[dimensión1] [dimensión2] ...
[dimensiónN]
Ejemplo Arreglo de dos dimensiones de orden 2x3.

m[2] = numero de filas.


char m[2][3];
m[3] = numero de columnas.
Ejemplo de uso de Arreglos
Declaración de un Array unidimensional o Vector en C++
• int my_vector1[10];
• float my_vector2[25];
• string my_vector3[500];
• bool my_vector4[1000];
• char my_vector5[2];
Cómo inicializar un Array o Vector en C++
string vector[5] = {"5", "hola", "2.7", "8,9", "adios"};
int vector2[] = {1,2,3,4,10,9,80,70,19};
Obtener el valor de una casilla específica en un array en C++

float vector4[5] = {10.5, 5.1, 8.9, 10, 95.2}; //Array con 5 elementos
float numero5 = vector4[4]; //Para acceder al elemento 5, se usa el índice 4
float primerNumero = vector4[0]; //Para el primer elemento se usa el índice 0
Ejemplo de uso de Arreglos
#include <iostream>
using namespace std;

int main(int argc, char** argv) {

int arreglo[] = {15,2,9,8,16,32,9,50,36,20,1,87};


int limite = (sizeof(arreglo)/sizeof(arreglo[0]));

for (int i = 0; i < limite; i++)


{
cout<<arreglo[i]<<endl;
}

return 0;
}
Ejemplo de uso de Arreglos

Ejemplo 1
Crear un arreglo donde tengamos 5 valores
, luego témenos que desplegar esos
valores en pantalla
Ejemplo de uso de Arreglos

Ejemplo 2
Crear un arreglo donde tengamos 100
valores , luego témenos que desplegar
esos valores en pantalla
Ejemplo de uso de Arreglos

Ejemplo 3
Crear un arreglo donde tengamos 100
valores , luego témenos que desplegar
únicamente los elementos pares.
Ejemplo de uso de Arreglos

Ejemplo 4
Crear un arreglo donde tengamos 100
valores , luego témenos que desplegar
únicamente los valores pares..
Ejemplo de uso de Arreglos

Ejemplo 5
Aplique el método burbuja para la
siguiente serie de números
100,43,5,4,2,6,4,9,9,8,7,4,1,2
Ejemplo de uso de Arreglos

Ejemplo 5
Aplique el método burbuja para la
siguiente serie de números
100,43,5,4,2,6,4,9,9,8,7,4,1,2
Ejemplo de uso de Arreglos

Ejemplo 6
Aplique el método burbuja para una serie
de números ingresados en total debería de
ser 10 números almacenados.
Ejemplo de uso de Arreglos

Ejemplo 7
Aplique el método burbuja para una serie
de números ingresados sin tope de
ingresos.
Ejemplo de uso de Arreglos

Ejemplo 8
Aplique el método burbuja utilizando
Llamados de funciones
Ejemplo de uso de Arreglos

Ejemplo 9
Aplique el método Quick Sort para una N
serie de números ingresados
Ejemplo de uso de Arreglos

Ejemplo 10
Aplique el método Quick Sort para una N
serie de números ingresados utilizando
funciones
Arreglos de Dos dimensiones
Es una matriz de datos de tamaño m x n que contiene información
almacenada del mismo tipo de datos (int, float, char, etc). Este tipo
de arreglos necesita dos subíndices para ser declarado o para
acceder a la información de un elemento en específico, a diferencia
de una matriz unidimensional que solo necesita un subíndice.

int matriz[3][4];
Esta matriz tendría 12 espacios para guardar información (3x4), y
gráficamente lo veríamos de la siguiente manera
Ejemplo
Construcción de un arreglo bidimensional para simular un estante
Arreglos de Dos dimensiones
#include <stdio.h> /* Declaración librerías*/
#include <stdlib.h>
#include <string.h>

int main(){
int contador;//Variable contadora de ciclos
char nombre[5][20]; //Arreglo que guardara los
nombres

//Ciclo en el que solicitamos los nombres a ingresar


for(contador=0;contador<5;contador++){
printf("Ingresa un nombre: ");
gets(nombre[contador]);
}

//Ciclo que imprime los nombres guardados


printf("\nNombres ingresados: \n");
for(contador=0;contador<5;contador++){
puts(nombre[contador]);
}

return 0;
}
Ejercicios

Ejercicio 1
Crear un Programa que pueda controlar
El Registro de 10 Personas en un arreglo
bidimensional de 10 X 20 al final de que
se logre completar todos los registros
mostrar el listado de ingresos.
Ejercicios

Ejercicio 2
Escribir un programa que lea una matriz de N filas y M
columnas de valores enteros. A continuació n, debe pedir
el nú mero de una fila (Recuerde validar dicho dato).
El pseudocó digo deberá devolver el mayor elemento de

esa fila .
Ejercicios

Ejercicio 3
Programa que rellene automá ticamente una
matriz N*M con la suma de sus índices (Es decir, el
elemento a[1][1] = 1+1=2, a[3][2] = 3+2=5). El
algoritmo mostrará la matriz resultante por
pantalla.
Ejercicios

Ejercicio 4
que imprime la suma de cada una de las filas de
una matriz bidimensional N*M.
Ejercicios

Ejercicio 5
que cree un array de N * 5 indicando que una
empresa tiene N vendedores cada uno de los
cuales realiza 5 ventas. El array almacena los
ingresos obtenidos por cada vendedor en cada
producto, imprimir el total de cada vendedor y
obtener los ingresos totales de la tienda..
Ejercicios

Ejercicio 6
Programa en C que lee un array de N*M elementos
y que guarda 0 en las posiciones pares y 1 en las
posiciones impares. Imprimir el array resultante
Ejercicios

Ejercicio 7
A la clase de Estructura de Datos asiste un grupo de N
alumnos. El profesor de dicha asignatura aplica 3 exá menes.
Realice un pseudocó digo que genere el array de N alumnos y
sus 3 calificaciones y que calcule e imprima:

• El promedio de calificaciones de cada alumno.


• El promedio general del grupo.
El nú mero del estudiante que tuvo el mayor promedio de
calificació n
Contenido

Pilas Colas
 Estructura  Definición Operaciones
Operaciones
 Ejemplos de aplicación
 Ejemplos de
Implementación
aplicación
Implementación
Colas con prioridad Colas
circulares
La estructura de datos PILA
• Su nombre se deriva de la
metáfora de una pila de Entra Sale

platos en una cocina.


Tope
• La inserción y extracción
de elementos de la pila
siguen el principio LIFO
(last-in-first-out).

• El último elemento en
entrar es el único accesible
en cada momento.
Definición de Pila
• Una pila (stack) es una colecciona ordenada de
elementos en la cual los datos se insertan o se retiran
por el mismo extremo llamado “parte superior” de la pila.
Operaciones básicas en Pilas (Push)

Existe solamente un lugar en donde cualquier elemento


puede ser agregado a la pila. Después de haber insertado el
nuevo elemento, G ahora es el elemento en la cima.
Operaciones básicas en Pilas (Pop)

Basta indicar que sea retirado un elemento. No


podemos decir “retirar C”, porque C no está en la cima
de la pila.
Ejemplo

1 4

1 1 1 1 1

4 4 4 4 4 4

push(4) push(1) push(1) pop() push(4) pop()

La dinámica de la pila, es decir, la manera en cómo entran


y salen los datos a la estructura de datos se denomina fifo
(first input, first output)
Utilidad de las Pilas
El concepto de pila es muy importante en computación y
en especial en teoría de lenguajes de programación. En
lenguajes procedurales como Pascal o C, la pila es una
estructura indispensable, debido a las llamadas a función.
Por que?
Cuando ocurre una llamada a alguna función, el estado
global del sistema se almacena en un registro y éste en
una pila. Cuando se termina de ejecutar algún
procedimiento, se recupera el registro que está en la cima
de la pila.

Otras aplicaciones de las Pilas?


Aplicaciones de las pilas
• Navegador Web
– Se almacenan los sitios previamente visitados
– Cuando el usuario quiere regresar (presiona el botón
de retroceso), simplemente se extrae la última
dirección (pop) de la pila de sitios visitados.
• Editores de texto
– Los cambios efectuados se almacenan en una pila
– Usualmente implementada como arreglo
– Usuario puede deshacer los cambios mediante la
operación “undo”, la cual extraer el estado del
texto antes del último cambio realizado.
Balance de Paréntesis
Es útil poder detectar si es que los paréntesis en un
archivo fuente están o no balanceados.

Se puede usar un stack: a+(b+c)*[(d+e])/f


Pseudo-código:

Crear el stack.

Mientras no se ha llegado al final del archivo de


entrada:

• Descartar símbolos que no necesiten ser


balanceados.
• Si es un paréntesis de apertura: poner en el
stack.
• Si es un paréntesis de cierre, efectuar un pop y
comparar.
Implementación de las Pilas
Una pila está conformada por dos elementos:

•Un espacio suficiente para almacenar los


elementos insertados en la pila.
•Una elemento que indique cuál es el elemento en la cima
de la pila.

La estructura Pila:
definir nuevo tipo estructura llamado "stack" con item :

un arreglo de 0 a “máximos” elementos enteros


top : un numero de -1 a (máximos – 1)

fin de la nueva estructura


Implementación de las Pilas

Es posible escribir un código en C/C++ que represente lo


anteriormente propuesto.
Implementación con arreglos
• Una pila es una colección #define STACKSIZE 100
ordenada de objetos. typedef struct stack{
int top;
• En C, los int
nodes[STACKSIZE
permiten
arreglos almacenar ];
colecciones ordenadas. Stack *create_stack
}Stack;
(Stack *S) {
S= (Stack *)
• Ladesventaja de malloc(sizeof(Stack));
implementar una pila S->top=-1;
mediante un arreglo es return S;
}
que esta última es de
tamaño fijo, main(){
mientras que usando Stack *S;
S=create_stack(S);
puede ser punteros
de tamaño :
dinámico.
la pila }
Operaciones en Pilas
Las operaciones básicas de una pila son:

1. En la pila S, insertar un elemento e: push(S,e)

2. Retirar un elemento de la pila S: pop(S)

3. Verificar si la pila S está vacía: stackempty(S)

4. Saber cuál es el elemento en la cima de la pila S:


stacktop(S).
La Operación Push
Esta operación sirve para insertar un elemento e en la pila
S, lo vamos a escribir como: push(S,e).
Después de hacer esta operación sucede que: El elemento
en la cima de la pila S ahora es e

Pila S

t
La Operación Push
(1) La operación push recibe : la dirección de una
estructura pila y un elemento entero.
(2) Incrementa el tope (cima) de la pila para agregar el
elemento en una posición libre de la pila.
(3) Asignando el valor e en la casilla S->top.
La Operación Push
(1) La operación push recibe : la dirección de una
estructura pila y un elemento entero.
(2) Incrementa el tope (cima) de la pila para agregar el
elemento en una posición libre de la pila.
(3) Asignando el valor e en la casilla S->top.

void push(Stack *S, int e) {

if(S->top == (STACKSIZE-1))
printf(“Full stack\n");
else {
S->top++;
S->nodes[S->top] = e;
}
}
La Operación Pop
Esta operación sirve para retirar el elemento en la cima de
la pila S, lo vamos a escribir como: pop(S,e).

Pila S

t
La Operación Pop
(1) La función devuelve un tipo entero al recibir la dirección
de una variable de tipo estructura pila (struct stack *).
Las líneas (4) y (5) son las mas importantes ya que se
almacena el valor que ser devuelto y se decrementa el
tope de la pila.
La Operación Pop
(1) La función devuelve un tipo entero al recibir la dirección
de una variable de tipo estructura pila (struct stack *).
Las líneas (4) y (5) son las mas importantes ya que se
almacena el valor que ser devuelto y se decrementa el
tope de la pila.

int pop(Stack *ps) {


if(ps->top == -1)
printf(“Empty stack\n");
else {
int t;
t = ps->nodes[ps-> top];
ps->top--;
return t;
}
}
La Operación Stacktop
Esta función debe devolver un número entero y dejar la
pila sin cambio. Para esto:
• pop(&A)
• Mostrar el elemento A
• push(&A,elemento).

Pila S Pila S

e
e
Mostrar e
r r

t t
La Operación Stacktop
El siguiente segmento de código ilustra cómo se han
usado las funciones antes creadas para implementar
Stacktop, por supuesto que se pueden separar y crear una
nueva función que haga lo mismo:
La Operación Stackempty
La operación stackempty se describe en el siguiente
segmento de código:
La estructura de datos cola
En una cola hay dos extremos, uno es llamado la parte
delantera y el otro extremo se llama la parte trasera de la
cola. En una cola, los elementos se retiran por la parte
delantera y se agregan por la parte trasera.
La estructura de datos cola
• Su nombre se deriva de la
metáfora de una cola de Entra

personas en una taquilla.


cola

• La inserción y extracción
de elementos de la cola
siguen el principio FIFO
(first-in-first-out).
frente

• El elemento con más


tiempo en la cola es el que Sale
puede ser extraído.
Operaciones en una cola
• Las operaciones básicas de una cola son “enqueue”
(meter) y “dequeue” (sacar)
– enqueue: añade un nuevo elemento al final de la cola
– dequeue: elimina (saca) el primer elemento de la cola

• Otras operaciones usualmente incluidas en el tipo


abstracto COLA son:
– isEmpty (estáVacia): verifica si la cola está vacía
– isFull (estáLlena): verifica si la cola está llena
Ejemplo de operaciones en una cola

Cola vacía

a enqueue(a)

a b enqueue(b)

a b c
enqueue(c)

b c dequeue()
Aplicaciones de las colas
• En general, operaciones en redes de
computadoras.
– Trabajos enviados a una impresora
– Solicitudes a un servidor.

• Clientes solicitando ser atendidos por una


telefonista.

• Mas aplicaciones de las estructuras tipo


cola?
Implementación de la estructura cola

De manera similar a las pilas, las colas definen una estructura no
estándar, de manera que se debe crear un nuevo tipo de dado, el tipo cola,
que debe tener los siguientes elementos:

 Un arreglo de n elementos de algún tipo específico, puede incluso ser un tipo


estándar o no.
 Un número que indica el elemento que está en la posición del frente de la cola.
 Un número que indica el elemento que está en la posición trasera de la cola.
Implementación de la estructura cola
Suponiendo que los elementos son números enteros, una
idea para representar una cola en C/C++ es usar un
arreglo para contener los elementos y emplear otras dos
variables para representar la parte frontal y trasera de la
cola.
Implementación de la estructura cola
#define QUEUESIZE 100
typedef struct queue{
 int front;
Una cola es una colección int rear;
ordenada de objetos. int
nodes[Q
UEUESI
 En C, los arreglos permiten ZE];
}Queue;
almacenar colecciones
Queue
ordenadas. *create_qu
euek
(Queue *ps) {
 Los arreglos tienen tamaño ps = (Queue *)
fijo. malloc(sizeof(Queue));
ps->front = 0;
ps->rear = -1;
return ps;
}

main(){
Operaciones en colas
Suponiendo que no existiera la posibilidad de caer en un
desbordamiento del arreglo, las operaciones enqueue
(insert) y dequeue (remove) quedan**:

** Asumiendo un comportamiento tipo Buffer.


Operaciones en colas

ENQUEUE DEQUEUE

void enqueue(Queue* ps,int i) { int dequeue (Queue *ps) {


if (ps->rear == (QUEUESIZE -1)) if(ps->front == ps->rear + 1)
printf(“Full queue\n"); printf(“Empty queue\n");
else { else{
ps->rear++; int t= ps->nodes[ps-> front];
ps->nodes[ps->rear] = i; ps->front++;**
} return t;
} }
}

** Asumiendo un comportamiento tipo Buffer.


Operaciones en colas

La operación empty:
Colas con prioridad
Una cola con prioridad es una estructura de datos en la
que se ordenan los datos almacenados de acuerdo a un
criterio de prioridad. Hay dos tipos de colas de prioridad:

• Las colas de prioridad con ordenamiento descendente.


• Las colas de prioridad con ordenamiento ascendente.
Colas con prioridad
Si CPA es una cola de prioridad ascendente, la operación
insert(CPA,x) inserta el elemento x en la cola CPA; y la
operación x=minRemove(CPA) asigna a x el valor del
elemento menor (de su prioridad) y lo remueve de la cola.

En las colas de prioridad descendente las operaciones


aplicables son insert(CPD,x) y x=maxRemove(CPD),
cuando CPD es una cola de prioridad descendente y x es
un elemento.

La operación empty(C) se aplica a cualquier tipo de cola y


determina si una cola de prioridad está vacía. La operación
de borrar se aplica solamente si la pila no está vacía.
Colas con prioridad
Cuando se requiere eliminar un dato de una cola de
prioridad se necesitan verificar todos los elementos
almacenados para saber cuál es el menor (o el mayor).

Esto conlleva algunos problemas, el principal es que el


tiempo necesario para eliminar un elemento puede crecer
tanto como elementos tenga la cola.
Colas Circulares
• El objetivo de una cola
circular es aprovechar
al máximo el
espacio del arreglo.
• La idea es
elementos en ins
localidades previamente ert
desocupadas. ar
las
• La implementación
tradicional considera dejar
un espacio entre el
frente y la cola.
Colas Circulares
Si se eliminan componentes quedan espacios disponibles en
las primeras posiciones del arreglo.

Cuando se encolan elementos disminuye el espacio para


agregar nuevos elementos en la zona alta del arreglo.

Este buffer se puede implementar aplicando aritmética


modular, si el anillo tiene N posiciones, la operación: rear =
(rear+1) Mod N, mantiene el valor de la variable cola entre 0 y
N-1.
Colas Circulares

Operación similar puede efectuarse para la variable head


cuando deba ser incrementada en uno.

La variable rear puede variar entre 0 y N-1.

Si rear tiene valor N-1, al ser incrementada en uno (módulo N), tomará valor
cero.

También se agrega una variable N con el numero de elementos encolados


para poder distinguir entre la cola vacía y llena.
Gracias por su atención

También podría gustarte