Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Colas
Colas
Estructuras de Datos
DEFINICION
Abunda este concepto, en la vida cotidiana
Final
Final
Frente
Frente
Cuando vamos al cine, para comprar las entradas
Cuando estamos en el supermercado, en el banco, etc.
Como funciona
Se puede decir que la cola tiene 2 extremos
FRENTE, Y FINAL
Todo el que llega se ubica al final de la cola
LA COLA QDesEncolar(Q);
elementos
, aunque
hay
Dijimos, una cola tiene dos extremos QEnColar(Q,’D’);
QEnColar(Q,’F’); espacio
Frente y Final atrás!
QEnColar(Q,’E’);
QEnColar(Q,’G’);
Siempre debemos llevar “control” de esas dos posiciones
typedef struct{
La estructura que definiría el nuevo TDA ArrayU Datos;
Cuando la cola recién comienza, int Frente;
El Frente es el índice inicial del arreglo: 0 int Final;
El Final, como no hay, es –1 } LsCont;
La cola esta vacía
Frente
Frente
Si Frente > Final
Frente
Final
Final
Final
La cola esta llena
Si Final == MAX –1
A medida que se ingresan elementos
El Final aumenta A B C D E F G
Cuando se eliminan 0 1 2 3 4 5 6
El Frente, se mueve hacia delante
MAX = 7
LSCONT: CAMBIOS
bool LSCont_EstaLlena(LSCont L){ Generico LSCont_ConsultarUltimo(LSCont L){
} }
4
0 1 2 3 4 2
3
¿Y COMO FUNCIONARIA?
Frente Frente
FinalFinal Final Final Final
Frente
En un arreglo lineal, vimos:
Al EnColar, el Final, se mueve hacia el siguiente
A B C D E
Al DesEnColar, el Frente, se mueve hacia el
siguiente 0 1 2 3 4
Final
Final
Frente Frente
Final A medida que los elementos se desencolaron y encolaron
0 1 La cola fue avanzando hacia la derecha
AG B
El Final ha alcanzado el MAXimo permitido
Sin embargo, al inicio del Arreglo, si hay espacios vacios
Final
E ¿Que hacer?
4 C Frente
Final
Deseamos poder utilizar los elementos del inicio del arreglo
D 2 Para colocar allí a los nuevos elementos
Es decir, que una vez que el Final llegue a su limite
Al encolar el final 3 El Final se pueda mover al inicio
se mueve al
siguiente En un arreglo lineal, el siguiente del índice 4 es el índice 5
Al desencolar el Final Podemos “asumir” que el siguiente de 4, no es el 5, es 0
frente se mueve
al siguiente
Sacrificar un elemento
La cola estará llena no con
Final
LSCONT: IMPLEMENTACION
bool LSCont_InsertarNodoFinal(LSCont *L, Generico G)
bool LSCont_EstaLLena(LSCont L){ {
return(Siguiente(Siguiente(L.Final))==L.Frente); Generico *elemento;
if(!LSCont_EstaLLena(*L)){
}
L->Final = Siguiente(L->Final);
elemento = ArrayU_Datos(L->Datos, L->Final);
bool LSCont_EstaVacia(LSCont *L){ *elemento = G;
return TRUE;
return(Siguiente(L.Final))==L.Frente);
}
}
return FALSE;
Generico LSCont_CoonsultarPrimero(LSCont L){ }
return(*ArrayU(L.Datos, L.Frente);
Generico LSCont_SacarNodoFinal(LSCont *L){
} generico tmp_frente;
if(!QEstaVacia(q)){
Generico LSCont_CoonsultarUltimo(LSCont L){
tmp_frente = LSCont_ConsultarPrimero(*L);
return(*ArrayU(L.Datos, L.Final);
L->Frente = Siguiente(L->Frente);
}
return(tmp_frente);
}
int Siguiente(int indice, int max){
return NULL;
if(indice == max-1) return 0;
}
return indice+1;
}
COLA: LISTA ENLAZADA
Con la implementación de listas enlazadas
Ya no existirá para nada el problema de desperdicio de memoria
Ni de limites máximo
No olvidemos que ya las operaciones de la Cola
Llamaran a las de la lista enlazada
bool QEstaVacia(Cola Q){ LSE_nodo* QFinal(Cola Q){
return(LSE_EstaVacia(Q));l return(LSE_ConsultarUltimo(Q));
} }
bool QEncolar(Cola *Q)(
LSE_nodo* QFrente(Cola Q){
return LSE_InsertarNodoInicio(Q);
return(LSE_ConsultarPrimero(Q));
}
}
IMPLEMENTACION
//Nodo enlazado a una cola
LSE_nodo *cviajero; //Nodo enlazado a una cola
Cola_Prioridad *c; LSE_nodo *cviajero;
Una cola de la lista puede accederse; Una cola de la lista puede accederse;
DINAMICA
c = Generico_ObtenerColaPrioridad(Cviajero->G);
c->Q
La prioridad y datos de la misma están en Cviajero->G
Cviajero->Q
La prioridad y datos de la misma están en
Cviajero->G
Frente Final