Gilberto 🦁 PRO
Desarrollo visualizaciones y aplicaciones en línea, colaboro con distintos medios digitales
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
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
| 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
| 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
| 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
| 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
| 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
| 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
| 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
| 417 | 13 |
frente
atrás
La implementación en C de una fila estática depende de tres cosas:
La estructura de datos para una fila estática que sólo almacena números enteros es algo así:
#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:
¿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:
La estructura de datos para una fila estática circular que sólo almacena números enteros es algo así:
#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...
By Gilberto 🦁
Filas
Desarrollo visualizaciones y aplicaciones en línea, colaboro con distintos medios digitales