Listas lineares Listas Lineares Pilha Fila Entrada restrita Fila Dupla Saída restrita Fila versus Pilha SAÍDA FIM SAÍDA ENTRADA Elemento 3 TOPO Elemento 2 Elemento 1 Elemento 2 Elemento 1 ENTRADA INÍCIO BASE Filas Operações primitivas que manipulam as filas: InicializaFila ou Construtor faz a fila q ficar vazia FilaVazia ou Empty retorna Verdadeiro se a fila q está vazia FilaCheia ou Full retorna Verdadeiro se a fila q está cheia InsereFila(x) ou Insert(x) insere o elemento x no final da fila RemoveFila ou Remove remove o PRIMEIRO elemento da fila, retornando o conteúdo do elemento como valor da função Filas REPRESENTANDO FILAS EM O.O. Pode utilizar um vetor Apoio de duas variáveis: front e rear Front: primeiro elemento da fila Rear: último elementos da fila class Queue { private object [] elements = new object[1000]; private int front, rear; ... } Filas Ignorando, momentaneamente, a possibilidade de overflow e underflow: Operação Insert (x): elements [++ rear] = x; Operação Remove (q): x= elements [front ++]; • No momento que a fila é criada, rear é definido como –1 e front como 0 • A fila está vazia sempre que rear < front • Número de elementos na fila é sempre igual ao valor de rear – front + 1 Filas Problema clássico da fila vazia sem possibilidade de inserir novos elementos: itens itens itens itens 4 E 3 D 2 C 1 B 0 front = 0 rear = -1 A rear=2 front=0 C front= rear=2 C rear =4 front =2 Filas Solução 1: remanejar todos os elementos quando remover um elemento public int Remove () { x = elements [ 0 ]; for (int i = 0; i < rear; i++) elements[ i ] = elements[ i + 1 ]; rear - -; • O campo front não é necessário porque o elemento na posição 0 do vetor está sempre no início da fila. A fila vazia é representada por rear igual a –1 • Podemos verificar que pode existir um grande esforço computacional para a movimentação de 500, 1000, 10.000, 1.000.000 elementos • Esta solução sugerida parece ser bastante ineficiente Filas Circulares • Solução mais elegante para resolver problema das filas • A idéia é armazenar os elementos na fila como um círculo. • Primeiro elemento do vetor vem logo depois do último. • Se o último elemento estiver ocupado, um novo valor pode ser inserido no primeiro elemento do vetor • Elemento novo não será incluído numa fila circular somente se não houver de fato espaço na mesma. Filas Circulares 4 3 2 1 0 elements E rear=4 D C front=2 elements E D C front=2 rear=0 F elements E front=4 elements E front=4 elements F G F G F rear =0 rear=1 rear= 1 front=0 No momento (d), rear < front (1 < 4), é verdadeira – fila vazia? Solução: utilizar um contador com o número de elementos. Filas Circulares Implementação dessa solução – atributos da classe: class Queue { private object [] elements; private int front, rear, size, count; // Métodos ... } Filas Circulares Implementação dessa solução – construtor: public Queue (int Size) { size = Size; elements = new object[size]; front = 0; rear = front; count = 0; } Filas Circulares Implementação dessa solução – retirar elementos: public object Remove () { if (Empty ()) { throw new Exception(“Fila vazia!”); } if (front == size – 1) front = 0; else front++; count --; return (elements[front]); } Filas Circulares Implementação dessa solução – inserir elementos: public void Insert (object x) { if (Full()) { throw new Exception (“Pilha Cheia!”); } if (rear == size – 1) rear = 0; else rear ++; elements[rear] = x; count ++; }