Filas circulares Sumário Condições de Contorno Implementação Java Implementação C++ 2 Condições de Contorno Condições de contorno Condição inicial head = tail = array.length -1 Fila vazia head = tail Fila cheia head = = (tail + 1) mod array.length 4 Implementação Java Definição da Classe QueueAsArray // pgm06_14.java public class QueueAsArray extends AbstractContainer implements Queue { protected Object[] array; protected int head; protected int tail; // ... } 6 Métodos construtor e purge da Classe QueueAsArray (1) // pgm06_15.java public class QueueAsArray extends AbstractContainer implements Queue { protected Object[] array; protected int head; protected int tail; public QueueAsArray (int size) { array = new Object [size]; head = 0; tail = size - 1; } 7 Métodos construtor e purge da Classe QueueAsArray (2) // pgm06_15.java (Continuação) public void purge () { while (count > 0) { array [head] = null; if (++head == array.length) head = 0; --count; } } // ... } 8 Método getHead da Classe QueueAsArray // pgm06_16.java public class QueueAsArray extends AbstractContainer implements Queue { protected Object[] array; protected int head; protected int tail; public Object getHead () { if(count == 0) throw new ContainerEmptyException (); return array [head]; } 9 Métodos enqueue e dequeue da Classe QueueAsArray public void enqueue (Object object) { if(count == array.length) throw new ContainerFullException (); if(++tail == array.length) tail = 0; array [tail] = object; ++count; } public Object dequeue () { if(count == 0) throw new ContainerEmptyException (); Object result = array [head]; array [head] = null; if(++head == array.length) head = 0; --count; return result; } // ... } 10 Método enqueue em filas circulares public void enqueue (Object object) { if(++tail == head) throw new ContainerFullException (); if(tail == array.length) tail = 0; array [tail] = object; ++count; } 11 Método dequeue em filas circulares public Object dequeue () { if(head == tail) throw new ContainerEmptyException (); if(++head == array.length) head = 0; --count; Object result = array [head]; array [head] = null; return result; } } 12 Implementação C++ COMPUTER ALGORITHMS/C++ http://www.cis.ufl.edu/~raj/BOOK.html E. Horowitz, S. Sahni, and S. Rajasekaran. W. H. Freeman Press, 1997 Declaração da Classe Fila Circular #define NULL 0 #include<iostream.h> template <class T> class Queue { private: T* q; int front, rear, MaxSize; public: Queue(int MSize): MaxSize(MSize) { q = new T[MaxSize]; rear=front=0; } ~Queue() { delete [] q; } bool AddQ(T item); bool DeleteQ(T& item); bool QFull(); bool QEmpty(); }; 15 Método enqueue em filas circulares template <class T> bool Queue<T>::AddQ(T item) // Insert item in the circular queue stored in q[MaxSize]. // rear points to the last item and front is one // position counterclockwise from the first item in q. { rear = (++rear) % MaxSize; // Advance rear clockwise. if (front == rear) { cout << "Queue is full" << endl; if (!front) rear = MaxSize-1; else rear--; // Move rear one position counterclockwise. return false; } else { q[rear] = item; // Insert new item. return true; } } 16 Método dequeue em filas circulares template <class T> bool Queue<T>::DeleteQ(T& item) // Removes and returns the front element // of the queue q[MaxSize]. { if (front == rear) { cout << "Queue is empty" << endl; return false; } else { front=(++front)%MaxSize; // Advance front clockwise. item = q[front]; // Return front of queue. return true; } } 17 Explicação de Const (1) const DataArea * Constante2 Declara que Constante2 é uma variável ponteiro para uma DataArea constante DataArea const * Constante2 É uma sintaxe alternativa com o mesmo significado DataArea * const Constante3 declara que Constante3 é uma variável ponteiro constante para uma variável DataArea DataArea const * const Constante4 Declara que Constante4 é um ponteiro constante para uma DataArea constante. Const se aplica a tudo que estiver à sua esquerda imediata. Se não houver nada à sua esquerda const se aplica a tudo que estiver à sua direita imediata. 18 Explicação de Const (2) Havia sido declarado ListElement<Object*> const* ptr; Significa que o ListElement cujo Datum é um Object* é constante Não se pode apagar o ListElement mas o seu Datum sim. 19