• No se han encontrado resultados

Tema 7. Colas http://aulavirtual.uji.es

N/A
N/A
Protected

Academic year: 2022

Share "Tema 7. Colas http://aulavirtual.uji.es"

Copied!
28
0
0

Texto completo

(1)

Tema 7. Colas

http://aulavirtual.uji.es

José M. Badía, Begoña Martínez, Antonio Morales y José M. Badía

{badia, bmartine, morales}@icc.uji.es Estructuras de datos y de la información

Universitat Jaume I

(2)

Índice

1. Definición y aplicaciones 5

2. Tipo Abstracto de Datos cola 7

3. La clase queue 8

4. Cola con un vector 11

5. Cola enlazada 17

6. Colas con prioridad 19

7. Bicolas 24

(3)

Bibliografía

ä

(Nyhoff’06), capítulo 8.

ä

(Orallo’02), capítulo 21.

ä

Using the STL, the C++ Standard Template Library. R. Robson. Springer, Segunda Edición, 1999. Capítulo 9.

(4)

Objetivos

ä

Conocer el concepto, funcionamiento y aplicaciones de tipo cola.

ä

Conocer el TAD cola y sus operaciones asociadas.

ä

Saber usar el tipo cola para resolver problemas.

ä

Saber implementar el tipo cola mediante vectores y nodos enlazados.

ä

Conocer variantes de cola como la cola con prioridad y la bicola.

ä

Conocer y saber usar los contenedores

queue

,

priority_queue

y

deque

de

la STL.

(5)

1 Definición y aplicaciones

Definición

Cola

estructura de datos lineal donde las inserciones y extraciones de datos se realizan siguiendo una política FIFO (first in first out). Primer dato en entrar es el primer dato en salir.

Características

ä

Homogénea: todos los elementos de la cola son del mismo tipo.

ä

Existe un orden de elementos ya que es una estructura lineal, pero los elementos no están ordenados por su valor, sino por orden de introducción en la cola.

ä

Existen dos extremos en la estructura lineal cola, el frente y el final de la cola.

ä

Sólo se puede acceder y eliminar al dato que está en el frente de la cola.

ä

Sólo se puede añadir información al final de la cola.

(6)

1 Definición y aplicaciones (II)

ä

Operaciones de manipulación:

í

Añadir: Añade un elemento al final de la cola.

í

Eliminar: Elimina el elemento del frente de la cola.

X F G A H

X F G A

L X F G A

L X F G

M L X F G

M L X F

Ejemplos: cola de clientes esperando pagar en una caja de supermercado, cola de clientes esperando ser atendidos por algún cajero en un banco, cola de

procesos esperando ser ejecutados por una CPU.

Al igual que la pila, la cola es una estructura de datos dinámica.

(7)

2 Tipo Abstracto de Datos cola

TAD cola

Usa logico, tipobase Operaciones:

CrearCola: → cola

ColaVacia: cola → logico Frente: cola → tipobase

Añadir: cola x tipobase → cola Eliminar: cola → cola

Axiomas: ∀ Q ∈ cola, ∀ e ∈ tipobase, 1) ColaVacia(CrearCola) = verdadero

2) ColaVacia(Añadir(Q,e)) = falso 3) Eliminar(CrearCola) = error

4) Eliminar(Añadir(CrearCola,e)) = CrearCola 5) Eliminar(Añadir(Q,e)) =

Añadir(Eliminar(Q),e)

6) Frente(CrearCola) = error

7) Frente(Añadir(CrearCola,e)) = e 8) Frente(Añadir(Q,e)) = Frente(Q)

(8)

3 La clase queue

ä queue

es una clase definida en la STL.

ä

Según las nomenclatura de la STL,

queue

es un adaptador, es decir, un

contenedor que se basa en otro contenedor más versátil, y que define nuevas operaciones que son normalmente un subconjunto de las del contenedor en que se basa.

ä

Un contenedor es una clase para “contener” (guardar) una colección de datos según una determinada política de acceso. Por ejemplo, contenedores de la STL son

vector

,

list

,

deque

,

string

, entre otros.

ä

Las clases

stack

y

queue

son adaptadores. Ambos se basan en el contenedor

deque

, del que hablaremos más adelante.

ä

Otro adaptador de la STL que estudiaremos es

priority_queue

.

(9)

3 La clase queue (II)

La clase

queue

será:

typedef i n t t i p o b a s e ; class queue {

p ub li c :

queue ( ) ;

bool empty ( ) const ;

const t i p o b a s e & f r o n t ( ) const ; void push ( const t i p o b a s e & x ) ; void pop ( ) ;

p r i v a t e : . . . } ;

(10)

3 La clase queue (III)

Ejemplo de utilización:

# include < queue>

# include < i o s t r e a m >

using namespace s t d ; void main ( ) {

queue q1 ; i n t i ;

f o r ( i = 0 ; i < 1 0 ; i + + ) q1 . push ( i ) ; while ( ! q1 . empty ( ) ) {

c o u t < < q1 . f r o n t ( ) < < ’ ’ ; q1 . pop ( ) ;

}

c o u t < < e n d l ; }

(11)

4 Cola con un vector

ä

Los elementos de la cola se guardan en un vector.

ä

El frente y el final de la cola son índices del vector.

3 8 2 10

1 final

frente

elementos

5

ä

frente

apunta

a la posición anterior a donde está el primer elemento de la cola.

ä

final

apunta

a la posición donde está el último elemento.

Primera opción:

ä

Vector lineal.

í

Cola llena:

final

apunta

a la última posición del vector.

í

Problema: puede desaprovecharse mucho espacio.

(12)

4 Cola con un vector (II)

Segunda opción:

ä

Vector circular

. . .

0 1 2 capacidad−1

¿Cómo se desplazan los índices

frente

y

final

?

f r e n t e = ( f r e n t e +1) % capacidad ; f i n a l = ( f i n a l +1) % capacidad ;

La función privada

int Siguiente(int)

facilitará los incrementos.

(13)

4 Cola con un vector (III)

4

8 1 10 3 9 12 5 0 7

frente = final

¿La cola está llena o vacía?

Para evitar esta ambigüedad se puede:

ä

Llevar un contador del número de elementos en la cola.

ä

No dejar que la cola se llene del todo, dejando al menos una posición libre.

Tomaremos esta segunda opción para nuestra implementación, por ser más simple.

(14)

4 Cola con un vector (IV)

typedef i n t t i p o b a s e ; class queue {

p ub li c :

queue ( i n t n = 2 5 6 ) ;

queue ( ) ;

queue (const queue & o r i g e n ) ; / / c o n s t r u c t o r de c o p i a

queue & operator = ( const queue & o r i g e n ) ; / / Op . a s i g n a c i ó n bool f u l l ( ) const ;

bool empty ( ) const ;

const t i p o b a s e & f r o n t ( ) const ; void push ( const t i p o b a s e & x ) ; void pop ( ) ;

(15)

4 Cola con un vector (V)

p r i v a t e :

i n t s i g u i e n t e ( i n t i ) const { r e t u r n ( ( i +1) % capacidad ) ; } i n t f r e n t e , f i n a l ;

Telementos ; i n t capacidad ; } ;

Tratamiento de errores:

Es responsabilidad del programador llamar a

empty()

antes de llamar a

front()

o

pop()

, y a

full()

antes de llamar a

push()

.

(16)

4 Cola con un vector (VI)

queue ( i n t n ) {

capacidad = n ;

elementos = new t i p o b a s e [ capacidad ] ; f r e n t e = 0 ; / / por ejemplo

f i n a l = 0 ; / / ha s e r i g u a l a f r e n t e }

queue ( ) {

d e l e t e [ ] elementos ; }

Escribe el código del constructor de copia y del operador de asignación.

(17)

5 Cola enlazada

ä

Cola: secuencia de nodos enlazados.

ä frente

y

final

son punteros al primer y último nodo.

Definimos la clase nodo como:

class nodo { p ub li c :

t i p o b a s e i n f o ; nodos i g ;

/ / c o n s t r u c t o r

nodo (const t i p o b a s e & v a l o r = t i p o b a s e ( ) , nodosignodo =NULL ) : i n f o ( v a l o r ) , s i g ( s i g u i e n t e ) { }

} ;

(18)

5 Cola enlazada (II)

Clase cola enlazada:

typedef i n t t i p o b a s e ; class queue {

p ub li c :

/ / c o n s t r u c t o r e s y d e s t r u c t o r e s

/ / o p e r a c i o n e s : empty , f r o n t , push , pop p r i v a t e :

class nodo {

/ / dat os y c o n s t r u c t o r } ;

nodof r e n t e ; nodof i n a l ; } ;

(19)

6 Colas con prioridad

ä

Colas con prioridad: los elementos tienen asociada una prioridad.

ä

Comportamiento:

í

Los elementos más prioritarios salen primero.

í

A igual prioridad, política FIFO.

Ejemplo: consulta médica. Prioridad: estado del paciente. Implementación:

. . . grave. . . . . . . . .

grave

m x a v

leve

moderado

frente b

grave . . .

Implementación:

ä

Se usan montículos (heaps): un tipo de árbol binario (tema 10).

(20)

6 Colas con prioridad (II)

La interfaz de la clase

priority_queue

es similar a la de la clase

queue

, pero:

ä

Se debe proporcionar el operador

<

del tipo base, en caso de que no esté ya definido.

ä

Se puede especificar otra función de comparación distinta.

De hecho, la plantilla de

priority_queue

está definida como:

template < class T , class Sequence= v e c t o r <T> ,

class Compare= l e s s <typename Sequence : : v a l u e _ t y p e > >

Es decir, la secuencia básica es un vector, pues un vector es muy adecuado para

implementar un montículo, como se verá en su momento. Y la función de comparación es la función

less

, que a su vez se basa en el operador

<

.

(21)

6 Colas con prioridad (III)

template < class T , Sequence= v e c t o r <T> ,

class Compare= l e s s <typename Sequence : : v a l u e _ t y p e > >

class p r i o r i t y _ q u e u e { p ub li c :

typedef typename Sequence : : v a l u e _ t y p e v a l u e _ t y p e ; typedef typename Sequence : : s i z e _ t y p e s i z e _ t y p e ; typedef typename Sequence : : r e f e r e n c e r e f e r e n c e ;

typedef typename Sequence : : c o n s t _ r e f e r e n c e c o n s t _ r e f e r e n c e ; protected :

Sequence c ; Compare comp ; p ub li c :

p r i o r i t y _ q u e u e ( ) ;

p r i o r i t y _ q u e u e (const Compare & x ) ; bool empty ( ) const ;

s i z e _ t y p e s i z e ( ) ;

c o n s t _ r e f e r e n c e t o p ( ) ;

void push ( const v a l u e _ t y p e & x ) ; void pop ( ) ; } ; / / c l a s s

(22)

6 Colas con prioridad (IV)

Ejemplo de uso:

# include < s t r i n g >

using namespace s t d ; class Persona {

p ub li c :

s t r i n g nombre ; i n t edad ;

Persona ( s t r i n g nmbr , i n t ed ) ;

f r i e n d bool operator < ( const Persona & p1 , const Persona & p2 ) ; f r i e n d bool operator ==( const Persona & p1 , const Persona & p2 ) ; } ;

bool operator < ( const Persona & p1 , const Persona & p2 ) { r e t u r n ( p1 . edad < p2 . edad ) ; }

bool operator ==( const Persona & p1 , const Persona & p2 ) { r e t u r n ( p1 . edad = = p2 . edad ) ; }

(23)

6 Colas con prioridad (V)

# include < i o s t r e a m >

# include < queue>

using namespace s t d ; void main ( ) {

p r i o r i t y _ q u e u e <Persona > pq ;

pq . push ( Persona ( ‘ ‘ Andres ’ ’ , 1 4 ) ) ; pq . push ( Persona ( ‘ ‘ Marta ’ ’ , 7 ) ) ; pq . push ( Persona ( ‘ ‘ I s a b e l ’ ’ , 1 2 ) ) ; pq . push ( Persona ( ‘ ‘ D a n i e l ’ ’ , 1 3 ) ) ; while ( ! pq . empty ( ) ) {

c o u t < < ( pq . t o p ( ) ) . nombre < < " , " < < ( pq . t o p ( ) ) . edad < < e n d l ; pq . pop ( ) ;

} }

(24)

7 Bicolas

ä

Bicola: cola en la que se pueden realizar inserciones y extracciones por ambos lados.

ä

Bicola en la STL: contenedor

deque

. Sobre él están basados los adaptadores

stack

y

queue

.

ä

Implementación:

deque

permite acceder en tiempo constante a cualquier elemento, como un vector, e implementa una complicada gestión dinámica de memoria que queda fuera del ámbito de la asignatura.

(25)

7 Bicolas (II)

class deque { p ub li c :

deque ( ) ;

deque ( ) ;

bool empty ( ) const ;

s i z e _ t y p e s i z e ( ) const ;

const t i p o b a s e & f r o n t ( ) const ; const t i p o b a s e & back ( ) const ;

void p u s h _ f r o n t ( const t i p o b a s e & x ) ; void push_back ( const t i p o b a s e & x ) ; void p o p _ f r o n t ( ) ;

void pop_back ( ) ; . . .

} ;

(26)

7 Bicolas (III)

ä

Las pilas (

stack

) y colas (

queue

) pueden verse como bicolas (

deque

) con

restricciones de acceso.

ä

En la STL, las clases

stack

y

queue

se implementan usando la clase

deque

.

Son adaptadores.

ä

Podrían implementarse en base a otras secuencias: listas, vectores, etc.

(27)

7 Bicolas (IV)

template < class T , class Sequence = deque<T> >

class s t a c k {

f r i e n d bool operator ==( const s t a c k & x , const s t a c k & y ) ; f r i e n d bool operator < ( const s t a c k & x , const s t a c k & y ) ; p ub li c :

typedef typename Sequence : : v a l u e _ t y p e v a l u e _ t y p e ; typedef typename Sequence : : s i z e _ t y p e s i z e _ t y p e ; typedef typename Sequence : : r e f e r e n c e r e f e r e n c e ;

typedef typename Sequence : : c o n s t _ r e f e r e n c e c o n s t _ r e f e r e n c e ; protected :

Sequence c ; p ub li c :

bool empty ( ) const { r e t u r n c . empty ( ) ; } s i z e _ t y p e s i z e ( ) const { r e t u r n c . s i z e ( ) ; } r e f e r e n c e t o p ( ) { r e t u r n c . back ( ) ; }

c o n s t _ r e f e r e n c e t o p ( ) const { r e t u r n c . back ( ) ; } void push ( const v a l u e _ t y p e & x ) { c . push_back ( x ) ; } void pop ( ) { c . pop_back ( ) ; } } ; / / de l a c l a s e

(28)

7 Bicolas (V)

template < class T , class Sequence = deque<T> >

class queue {

f r i e n d bool operator ==( const queue & x , const queue & y ) ; f r i e n d bool operator < ( const queue & x , const queue & y ) ; p ub li c :

. . .

protected :

Sequence c ; p ub li c :

bool empty ( ) const { r e t u r n c . empty ( ) ; } s i z e _ t y p e s i z e ( ) const { r e t u r n c . s i z e ( ) ; } r e f e r e n c e f r o n t ( ) { r e t u r n c . f r o n t ( ) ; }

c o n s t _ r e f e r e n c e f r o n t ( ) const { r e t u r n c . f r o n t ( ) ; } r e f e r e n c e back ( ) { r e t u r n c . back ( ) ; }

c o n s t _ r e f e r e n c e back ( ) const { r e t u r n c . back ( ) ; } void push ( const v a l u e _ t y p e & x ) { c . push_back ( x ) ; } void pop ( ) { c . p o p _ f r o n t ( ) ; }

} ;

Referencias

Documento similar

1. LAS GARANTÍAS CONSTITUCIONALES.—2. C) La reforma constitucional de 1994. D) Las tres etapas del amparo argentino. F) Las vías previas al amparo. H) La acción es judicial en

En cuarto lugar, se establecen unos medios para la actuación de re- fuerzo de la Cohesión (conducción y coordinación de las políticas eco- nómicas nacionales, políticas y acciones

En el capítulo de desventajas o posibles inconvenientes que ofrece la forma del Organismo autónomo figura la rigidez de su régimen jurídico, absorbentemente de Derecho público por

D) El equipamiento constitucional para la recepción de las Comisiones Reguladoras: a) La estructura de la administración nacional, b) La su- prema autoridad administrativa

• Ello permite plantear una primera etapa de normalización de los sistemas de clasificación, al proveer al Ayuntamiento de un marco general que abarque toda su

 Sistema Operativo (SO): conjunto de programas que gestiona todos los recursos físicos de la máquina (hardware) y sirve como soporte a las capas superiores de software

El paso siguiente es escoger de esta columna el menor valor, y en una tabla paralela se le asigna la mayor cantidad posible de unidades, podemos observar como el menor costo es «2»

Es cierto que si esa persona ha tenido éxito en algo puede que sea trabajadora, exigente consigo misma y con los demás (eso sí son virtudes que valoro en