Videolivro 3 - filas com uso de vetores

Site: Ambiente Virtual de Ensino e Aprendizagem
Curso: Estruturas de Dados
Livro: Videolivro 3 - filas com uso de vetores
Impresso por: Usuário visitante
Data: domingo, 19 Mai 2024, 01:59

1. Filas

Uma fila é uma estrutura na qual o primeiro elemento a entrar é também o primeiro a sair: FIRST IN FIRST OUT (FIFO).

Exemplo é uma fila no banco:

filabanco

Fonte da imagem:DIREITOS BRASIL. Lei das Filas: Tempo máximo de espera e punições. [2018]. Disponível em: https://direitosbrasil.com/lei-das-filas-tempo-maximo-de-espera-e-punicoes/. Acesso em: 25 set. 2018.

A lista pode ser implementada como um vetor, no qual o elemento que está na posição 0 (zero) foi o primeiro a chegar na fila e, portanto, será o primeiro a sair.

A Figura a seguir representa um exemplo de uma fila de jogadores de futebol à espera para pegar o uniforme do time.

filaparte1

No exemplo da figura que acabamos de ver, o José foi o primeiro a chegar, enquanto o Cróvis foi o último.

1.1. A classe Fila

Implementaremos a classe Fila da seguinte forma:

1o) Com uma variável do tipo inteiro para definir o tamanho da Fila (sua capacidade), assim como fizemos com a Pilha.

2o.) Com uma variável do tipo inteiro para definir a última posição ocupada na Fila.

3o.) O vetor do tipo Object, pois assim o objeto da classe fila poderá ser do tipo String (como no caso do exemplo que acabamos de mostrar) ou valores numéricos.

4o.) O construtor da classe com a última posição valendo -1 (menos 1), o tamanho e o vetor (assim como fizemos para a Pilha).

Vejamos como fica a classe Fila:

A classe Fila

import javax.swing.JOptionPane;
public class Fila {
	int tamanho;
	int ultimapos;
	Object vetor[];
	Fila (int tam){
		ultimapos = -1;
		tamanho = tam;
		vetor = new Object [tam];
	}

}

1.2. Os métodos filaVazia() e filaCheia()

Construiremos uma função do tipo boolean para retornar true se a fila estiver vazia, ou false caso contrário.

Função filaVazia()

public boolean filaVazia() {
	if (ultimaPos == -1)
		return true;
	else
		return false;	
}
Para verificar se a fila está cheia, testaremos se a última posição (variável ultimaPos) é igual ao tamanho do vetor menos 1.

Função filaCheia()

public boolean filaCheia() {
	if (ultimaPos == tamanho - 1)
		return true;
	else
		return false;
}

Vamos agora começar a preencher a fila.

1.3. Enfileirar elementos

Para enfileirar elementos, primeiramente precisamos testar se a fila está cheia. Neste caso, enviaremos uma mensagem "Fila cheia" e não faremos nada. Caso contrário, somamos mais um à ultima posição da fila e inserimos lá o elemento. 

Lembra-se que a variável ultimaPos, que representa a última posição do vetor, recebeu -1 (menos 1) no construtor da classe? Pois bem, caso seja o primeiro elemento a ser enfileirado a posição -1 vai receber portanto, o valor 0, que será a primeira posição do vetor.

Vejamos o método:

Método enfileirar()

public void enfileirar (Object valor) {
	if (filaCheia())
		JOptionPane.showMessageDialog(null,  "Fila cheia");
	else {
		ultimaPos++;
		vetor[ultimaPos]= valor;
	}
}

Agora que sabemos enfileirar, vamos criar o programa principal que instancia um objeto da classe Fila e enfileira os elementos.

1.4. Programa Principal

Nosso programa Principal vai permitir ao usuário definir o tamanho da fila.

Em seguida, vamos preencher toda a fila

Vejamos:

Programa principal

import javax.swing.JOptionPane;
public class Principal {

	public static void main(String[] args) {
		int tamanho;
		tamanho = Integer.parseInt(JOptionPane.showInputDialog("Qual a tamanho máximo da fila? "));
		Fila pessoas = new Fila (tamanho);
		String nome;
		int cont;
		
		for (cont=0;cont < tamanho; cont++) {
			nome = JOptionPane.showInputDialog("Nome a inserir");
			pessoas.enfileirar(nome);
		}


	}

}




O que fizemos até então foi preencher todo o vetor, ou seja, esgotar a capacidade da fila. Vamos agora mostrar o conteúdo da fila.

1.5. O método mostrarFila()

A ideia de mostrar toda a fila é simples: percorremos o vetor até a última posição preenchida e mostramos os valores que, em nosso exemplo, guardamos em uma variável do tipo String.

Método mostrarFila()

public void mostrarFila() {
	int cont;
	String mensagem = "";
	for (cont=0;cont<=ultimaPos; cont++) {
		mensagem = mensagem + vetor[cont] + " ! ";
		
	}
	System.out.println(mensagem);
}
Agora chamaremos o método em nosso programa Principal:

Programa Principal com o método mostrarFila()

import javax.swing.JOptionPane;
public class Principal {

	public static void main(String[] args) {
		int tamanho;
		tamanho = Integer.parseInt(JOptionPane.showInputDialog("Qual a tamanho máximo da fila? "));
		Fila pessoas = new Fila (tamanho);
		String nome;
		int cont;
		
		for (cont=0;cont < tamanho; cont++) {
			nome = JOptionPane.showInputDialog("Nome a inserir");
			pessoas.enfileirar(nome);
		}
		pessoas.mostrarFila();
	}
}


1.6. O método desenfileirar ()

Desenfileirar não é um procedimento tão simples.

Veja a figura a seguir, criada hipoteticamente, para representar os jogadores de um time de futebol em uma fila de espera para receber o uniforme do time.

filatotal1

Como podemos notar, o José foi o primeiro a chegar, enquanto Cróvis foi o último.

Veja na próxima figura o que acontece quando José recebe seu uniforme e, portanto, sai da fila:

posicao0vazia

A posição 0, que era aquela ocupada pelo José, ficou vazia. Com isso, necessitamos mover todos os jogadores uma posição para a frente, de tal forma que a última posição (a de número 5) é que deve ficar vazia. Assim:

posicao5vazia

Quando o próximo jogador sair da fila (que é o Márcio), novamente a fila se move uma posição para a frente, de tal forma que as duas últimas ficarão vazias, conforme mostra a próxima figura:

duasposicoesvazias

O procedimento deve então fazer com que todos os elementos movam uma posição para frente, sempre que alguém sair da fila.

Como em uma fila o primeiro a entrar é o último a sair e, sabemos que o primeiro está sempre na posição 0, basta considerar que, a cada saída, a última posição do vetor diminui de um (lembre-se: a última posição, não o tamanho do vetor, que permanece o mesmo) e todos os elementos são "empurrados" para frente.