Estructuras de datos

Filas

Una fila es una estructura lineal que sigue el principio FIFO (first in, first out): sólo se puede agregar un elemento al final de la fila y sólo se puede tomar (o eliminar) el elemento que esté al frente de la fila

Filas

frente

atrás

Una fila es una estructura lineal que sigue el principio FIFO (first in, first out): sólo se puede agregar un elemento al final de la fila y sólo se puede tomar (o eliminar) el elemento que esté al frente de la fila

Filas

100

frente

atrás

Una fila es una estructura lineal que sigue el principio FIFO (first in, first out): sólo se puede agregar un elemento al final de la fila y sólo se puede tomar (o eliminar) el elemento que esté al frente de la fila

Filas

100 350

frente

atrás

Una fila es una estructura lineal que sigue el principio FIFO (first in, first out): sólo se puede agregar un elemento al final de la fila y sólo se puede tomar (o eliminar) el elemento que esté al frente de la fila

Filas

100 350 525

frente

atrás

Una fila es una estructura lineal que sigue el principio FIFO (first in, first out): sólo se puede agregar un elemento al final de la fila y sólo se puede tomar (o eliminar) el elemento que esté al frente de la fila

Filas

350 525

frente

atrás

Una fila es una estructura lineal que sigue el principio FIFO (first in, first out): sólo se puede agregar un elemento al final de la fila y sólo se puede tomar (o eliminar) el elemento que esté al frente de la fila

Filas

350 525 417

frente

atrás

Una fila es una estructura lineal que sigue el principio FIFO (first in, first out): sólo se puede agregar un elemento al final de la fila y sólo se puede tomar (o eliminar) el elemento que esté al frente de la fila

Filas

525 417

frente

atrás

Una fila es una estructura lineal que sigue el principio FIFO (first in, first out): sólo se puede agregar un elemento al final de la fila y sólo se puede tomar (o eliminar) el elemento que esté al frente de la fila

Filas

525 417 13

frente

atrás

Una fila es una estructura lineal que sigue el principio FIFO (first in, first out): sólo se puede agregar un elemento al final de la fila y sólo se puede tomar (o eliminar) el elemento que esté al frente de la fila

Filas

417 13

frente

atrás

La implementación en C de una fila estática depende de tres cosas:

  1. Una estructura de datos que contenga una referencia a un arreglo para guardar los elementos de la fila, una referencia al inicio de la fila y una referencia al final de la fila
  2. Cinco funciones para manipular la fila

Filas

La estructura de datos para una fila estática que sólo almacena números enteros es algo así:

Filas

#include <stdio.h>
#include <stdbool.h>

//Tamaño máximo de la fila
#define MAX 100

//La estructura que describe la fila
typedef struct {
    int arreglo[MAX];  
    int frente;        
    int atras;        
} Fila;


//Función para inicializar una fila
void initialize(Fila *fila) {
    fila->frente = -1;  
    fila->atras = 0;  
}


int main() {
    Fila f;

    initialize(&f);  

    return 0;
}

Mientras que las operaciones son:

  • enqueue(fila, valor) para agregar valor en fila
  • dequeue(fila) para remover el elemento al frente de fila y regresarlo
  • peek(fila) para regresar el elemento al frente de fila
  • isEmpty(fila) para saber si fila está vacía
  • isFull(fila) para saber si fila está llena

Filas

¿Cómo creen que deberían implementarse esas funciones?

#include <stdio.h>
#include <stdbool.h>

//Tamaño máximo de la fila
#define MAX 100
#define ERROR_OVERFLOW -1
#define ERROR_UNDERFLOW -2
#define ERROR_EMPTY -3
#define ERROR_FULL -4

//La estructura que describe la fila
typedef struct {
    int arreglo[MAX];  
    int frente;        
    int atras;        
} Fila;


//Función para inicializar una fila
void initialize(Fila *f) {
    f->frente = -1;  
    f->atras = 0;  
}

//Función para determinar si una fila está vacía
bool isEmpty(Fila *f) {
	return f->frente == f->atras - 1;
}

//Función para determinar si una fila está llena
bool isFull(Fila *f) {
	return f->atras == MAX;
}

//Función para agregar un elemento nuevo a la fila
int enqueue(Fila *f, int valor) {
	if (isFull(f)) {
		printf("La fila está llena\n");
        return ERROR_OVERFLOW;
	}
	else {
    	f->arreglo[f->atras] = valor;
        f->atras = f->atras + 1;
		printf("Se agregó el valor %d a la fila\n", valor);
        return 0;
	}
}


//Función para remover un elemento de una fila
int dequeue(Fila *f) {
	if (isEmpty(f)) {
		printf("La fila está vacía\n");
		return ERROR_UNDERFLOW;
	}
	else {
    	f->frente = f->frente + 1;
		int removido = f->arreglo[f->frente];
		printf("Removí %d de la fila\n", removido);
		return removido;
	}
}

//Función para ver el próximo elemento a remover de la fila
int peek(Fila *f) {
	if (isEmpty(f)) {
		printf("La fila está vacía\n");
		return ERROR_EMPTY;
	}
	return f->arreglo[f->frente + 1];
}

int main() {
	Fila f;
	int v;

	initialize(&f);

	enqueue(&f, 10);
	enqueue(&f, 4);
	enqueue(&f, 13);
	enqueue(&f, 5);

	while(!isEmpty(&f)) {
		v = dequeue(&f);
	}
	
	enqueue(&f, 7);
	enqueue(&f, 13);
	v = dequeue(&f);
	v = dequeue(&f);
	v = dequeue(&f);


	return 0;
}

Y acá tienen una implementación como ejemplo...

El problema con las filas estáticas es que pueden encontrarse llenas aunque no contengan ningún elemento

 

La solución a lo anterior es modificar un poco la definición de fila para hacerla circular:

  1. La estructura fundamental debe contener una referencia a un arreglo para guardar los elementos de la fila, una referencia al inicio de la fila (que inicia en 0) y una referencia a la cantidad de elementos guardados en la fila
  2. Utiliza las mismas funciones pero con cambios en la implementación

Filas circulares

La estructura de datos para una fila estática circular que sólo almacena números enteros es algo así:

Filas circulares

#include <stdio.h>
#include <stdbool.h>

//Tamaño máximo de la fila
#define MAX 100

//La estructura que describe la fila
typedef struct {
    int arreglo[MAX];  
    int frente;        
    int n;        
} Fila;


//Función para inicializar una fila
void initialize(Fila *fila) {
    fila->frente = 0;  
    fila->n = 0;  
}


int main() {
    Fila f;

    initialize(&f);  

    return 0;
}
#include <stdio.h>
#include <stdbool.h>

//Tamaño máximo de la fila
#define MAX 100
#define ERROR_OVERFLOW -1
#define ERROR_UNDERFLOW -2
#define ERROR_EMPTY -3
#define ERROR_FULL -4

//La estructura que describe la fila
typedef struct {
    int arreglo[MAX];  
    int frente;        
    int n;        
} Fila;


//Función para inicializar una fila
void initialize(Fila *f) {
    f->frente = 0;  
    f->n = 0;  
}

//Función para determinar si una fila está vacía
bool isEmpty(Fila *f) {
	return f->n == 0;
}

//Función para determinar si una fila está llena
bool isFull(Fila *f) {
	return f->n == MAX;
}

//Función para agregar un elemento nuevo a la fila
int enqueue(Fila *f, int valor) {
	if (isFull(f)) {
		printf("La fila está llena\n");
        return ERROR_OVERFLOW;
	}
	else {
    	int atras = (f->frente + f->n) % MAX;
        f->arreglo[atras] = valor;
        f->n = f->n + 1;       
		printf("Se agregó el valor %d a la fila\n", valor);
        return 0;
	}
}


//Función para remover un elemento de una fila
int dequeue(Fila *f) {
	if (isEmpty(f)) {
		printf("La fila está vacía\n");
		return ERROR_UNDERFLOW;
	}
	else {
    	int removido = f->arreglo[f->frente];
        f->frente = (f->frente + 1) % MAX;
        f->n = f->n - 1;   	
		printf("Removí %d de la fila\n", removido);
		return removido;
	}
}

//Función para ver el próximo elemento a remover de la fila
int peek(Fila *f) {
	if (isEmpty(f)) {
		printf("La fila está vacía\n");
		return ERROR_EMPTY;
	}
	return f->arreglo[f->frente];
}

int main() {
	Fila f;
	int v;

	initialize(&f);

	enqueue(&f, 10);
	enqueue(&f, 4);
	enqueue(&f, 13);
	enqueue(&f, 5);

	while(!isEmpty(&f)) {
		v = dequeue(&f);
	}
	
	enqueue(&f, 7);
	enqueue(&f, 13);
	v = dequeue(&f);
	v = dequeue(&f);
	v = dequeue(&f);


	return 0;
}

Y acá tienen una implementación como ejemplo...

Estructuras de datos: Filas

By Gilberto 🦁

Estructuras de datos: Filas

Filas

  • 152