inserção de um novo elemento na fila remoção de um ... · 5 estrutura de dados: - fila é um...
TRANSCRIPT
1
EAD FILA - DEFINIÇÃO
Os seus elementos são processados por ordem de chegada:
- o primeiro elemento a entrar na fila é o primeiro a sair (FIFO — “First In First Out”).
Algumas operações realizam-se na cabeça e outras na cauda
Cabeça Cauda
Elem1 Elem2 Elem3 Elem4 Elem5 Elem6
Inserção de um novo elemento na Fila
- realiza-se na cauda da fila
- consiste em acrescentar o novo elemento na cauda da fila,
- torna o novo elemento a cauda da fila;
Remoção de um elemento da Fila
- não se aplica a filas vazias,
- realiza-se na cabeça da fila, eliminando o elemento que ali se encontra,
- torna o elemento que está a seguir (o seu sucessor) a cabeça da fila.
Fila vazia
- acontece quando for retirado o último elemento da fila,
- apenas é possível efetuar a operação de inserção de elementos na fila.
2
EAD Fila - Definição axiomática
Estrutura Fila (Elemento)
CriarFila(Elemento) → Fila
FilaVazia(Fila) → 1 (verdadeiro) ou 0 (falso)
JuntarFila(Elemento, Fila) → Fila
RemoverFila(Fila) → Fila
FrenteFila(Fila) → Elemento
tais que ∀ Q ∈ Fila, ∀ Elem ∈ Elemento sejam
FilaVazia(CriarFila(Elem)) = 0 (falso)
FilaVazia(JuntarFila(Elem, Q)) = 0 (falso)
RemoverFila(CriarFila(Elem)) = ∅ (fila vazia)
RemoverFila(Q) = Se FilaVazia(Q) Então ERRO Senão Q - FrenteFila(Q)
RemoverFila(JuntarFila(Elem, Q)) = Se FilaVazia(Q) Então Q
Senão JuntarFila(Elem, RemoverFila(Q))
FrenteFila(Q) = Se FilaVazia(Q) Então ERRO Senão FrenteFila(Q)
FrenteFila(CriarFila(Elem)) = Elem
FrenteFila(JuntarFila(Elem, Q)) = Se FilaVazia(Q) Então Elem Senão FrenteFila(Q)
Fim Fila
3
EAD Fila - Operações básicas
- Criar uma Fila (com um Elemento): CriarFila(Elemento)
- Verificar se uma Fila está vazia: FilaVazia(Fila)
- Colocar um Elemento numa Fila (na cauda): JuntarFila(Elemento, Fila)
- Remover elemento de uma Fila (da cabeça): RemoverFila(Fila)
- Consultar uma Fila (a cabeça): FrenteFila(Fila)
EAD Fila - implementação usando listas
- Armazenamento
- sequencial (usando vetores) ou
- não sequencial (usando listas ligadas).
- Neste documento, a implementação é através de listas ligadas simples, as quais são
simuladas com vetores.
- Implementação usando listas ligadas simples:
- apenas se utiliza um ponteiro associado à cabeça da fila,
- este ponteiro é o índice do nodo do vetor que contém o elemento da cabeça da fila.
4
EAD FILA - ARMAZENAMENTO NÃO SEQUENCIAL COM VETORES
Indicador de cabeça da fila
- índice do nodo com o elemento mais antigo da fila,
- será o primeiro a ser removido,
- permite acesso à cauda da fila,
- quando nulo (0) significa que a fila está vazia.
Uma fila nunca está cheia,
- pode é não haver memória suficiente para guardar um novo elemento
5
Estrutura de dados:
- Fila é um vetor em que cada componente (nodo) é composto por 2 campos:
- Elemento (informação a tratar), que pode ser um tipo de dados
- não estruturado básico (inteiro, real, caracter, ...), ou
- estruturado (vetor, matriz, registo, ...); se o tipo de dados é um registo, então é
composto por um ou mais subcampos (dependendo do volume de informação a tratar)
em que um deles pode funcionar como Chave;
- Prox, é um número inteiro associado ao índice do nodo que o segue na fila (o sucessor);
- Cabeca (índice do nodo do vetor associado à cabeça da fila)
- Representação de um nodo da fila:
Nodo
Elemento Informação
Prox Sucessor
6
Exemplo: Fila em que o elemento de cada nodo é um inteiro.
Representação gráfica:
Cabeça
16 • 29 • 14 • 18 • 36 • 23 •
Estrutura de dados:
Fila(k) = struct { Elemento, Prox }, k = 1, ...
Fila é um tipo de dados estruturado, mais especificamente um registo (estrutura);
Elemento é um tipo de dados não estruturado básico (inteiro).
Cabeca = 3
Fila 1 2 3 4 5 6
Elemento 29 23 16 14 36 18
Prox 4 0 1 6 2 5
Implementação em MatLab:
Fila(Cabeca) = 16
7
Operações auxiliares sobre uma EAD Fila:
- Criar um nodo de uma Fila [CriarNodo - EAD Lista]
- Determinar o tamanho de uma Fila [TamanhoLista - EAD Lista]
- Libertar/destruir um nodo de uma Fila [LibertarNodoLista - EAD Lista]
Operações básicas sobre uma EAD Fila:
- Criar uma Fila (com um elemento) [CriarLista - EAD Lista]
- Verificar se uma Fila está vazia [ListaVazia - EAD Lista]
- Inserir um elemento numa Fila (na cauda) [InserirFimLista - EAD Lista]
- Remover um elemento de uma Fila (o da frente) [remoção específica]
- Consultar um elemento de uma Fila (o da frente) [consulta específica]
Operações específicas sobre os elementos de uma EAD Fila:
- Criar um elemento de uma Fila (CriarElemento - Exemplos de EAD Lista)
- Mostrar um elemento de uma Fila (MostrarElemento - Exemplos de EAD Lista)
8
Criar um nodo de uma Fila a partir de um elemento
Notas:
- operação usada para criar um nodo com um elemento para posterior inserção numa fila
- função igual a "CriarNodo" da EAD Lista
Parâmetros:
Entrada: informação referente a um elemento (Elem)
Saída: um nodo isolado composto pelo elemento fornecido e sem sucessor (Nodo)
Função implementada em MatLab (iterativa):
function [Nodo] = CriarNodo (Elem)
Nodo.Elemento = Elem;
Nodo.Prox = 0;
9
Determinar o tamanho de uma fila
Notas:
- operação para determinar o número de elementos da fila, o qual é usado na operação para
inserir um elemento numa fila, para atualizar o tamanho do vetor da fila
- função igual a "TamanhoLista" da EAD Lista
Parâmetros:
Entrada: fila (Fila) e cabeça da fila (Cabeca)
Saída: tamanho (quantidade de elementos) da fila (tamFila)
Função implementada em MatLab:
function [tamFila] = TamanhoFila (Fila, Cabeca)
k = Cabeca;
tamFila = 0;
while k ~= 0
tamFila = tamFila + 1;
k = Fila(k).Prox;
end;
10
Libertar um nodo de uma Fila
Notas:
- operação usada para libertar um nodo do vetor da fila, após remoção da fila
- função igual a "LibertarNodoLista" da EAD Lista
Parâmetros:
Entrada: fila (Fila) e cabeça da fila (Cabeca)
Saída: vetor da fila sem o nodo libertado (Fila) e cabeça da fila atualizado (Cabeca)
Função implementada em MatLab:
Nota: TamanhoFila é uma operação auxiliar da EAD Fila
function [Fila, Cabeca] = LibertarNodoFila (Fila, Cabeca)
tam = TamanhoFila(Fila, Cabeca); % determinar o número de elementos da fila
if tam == 0
return;
end;
% determinar o nodo a libertar (indNodo), que tem o seu campo Prox = -1
indNodo = 1;
while indNodo <= tam & Fila(indNodo).Prox ~= -1
indNodo = indNodo + 1;
end;
11
if indNodo > tam % verificar se o índice do nodo a libertar é o último do vetor
Fila(indNodo) = [];
return; % não existe nodo a libertar ou está no fim do vetor
end;
% a fila tem um elemento a menos, mas o vetor da fila mantém o nodo;
% assim, este nodo deve ser libertado/retirado do vetor (isto é, eliminado)
% primeiro: eliminar o nodo da posição indNodo do vetor
Fila(indNodo) = [];
% segundo: atualizar os campos Prox dos nodos com valores maiores do que indNodo
for i = 1:tam
if Fila(i).Prox > indNodo
Fila(i).Prox = Fila(i).Prox - 1;
end;
end;
% terceiro: atualizar a cabeça da fila, Cabeca, se for um índice superior a indNodo
if Cabeca >= indNodo
Cabeca = Cabeca - 1;
end;
12
Criar uma Fila (com um elemento)
Nota:
- função igual a "CriarLista" da EAD Lista
Parâmetros:
Entrada: informação relativa a um elemento (Elem)
Saída: fila com um nodo (Fila) e cabeça da fila (Cabeca)
Função implementada em MatLab:
Nota: CriarNodo é uma operação auxiliar da EAD Fila
function [Fila, Cabeca] = CriarFila (Elem)
Nodo = CriarNodo(Elem);
Fila(1) = Nodo;
Cabeca = 1;
13
Verificar se uma Fila está vazia
Notas:
- uma fila está vazia se a cabeça é 0
- função igual a "ListaVazia" da EAD Lista
Parâmetros:
Entrada: cabeça a fila (Cabeca)
Saída: 1 (se a fila está vazia) ou 0 (se a fila não está vazia)
Função implementada em MatLab:
function [vazia] = FilaVazia (Cabeca)
if Cabeca == 0
vazia = 1;
else
vazia = 0;
end;
14
Inserir um elemento numa Fila (JuntarFila)
Notas:
- usar a função "InserirFimLista" da EAD Lista (adaptando-a à EAD Fila)
Parâmetros:
Entrada: elemento a inserir (Elem), fila (Fila) e cabeça da fila (Cabeca)
Saída: fila com mais um elemento (Fila) e cabeça da fila (Cabeca)
15
Função implementada em MatLab:
Nota: TamanhoFila e CriarNodo são operação auxiliares da EAD Fila
function [Fila, Cabeca] = JuntarFila (Elem, Fila, Cabeca)
Novo = CriarNodo(Elem);
if Cabeca == 0
% fila vazia, logo Elem é o primeiro e único da fila
Fila(1) = Novo;
Cabeca = 1;
return;
end;
% fila não vazia - posicionar-se no último nodo da fila (pUltimo)
indUltimo = Cabeca;
while Fila(indUltimo).Prox ~= 0
indUltimo = Fila(indUltimo).Prox;
end;
% inserir o nodo com o Elem como sucessor do último nodo da fila
indNovo = TamanhoFila(Fila, Cabeca) + 1; % posição do novo nodo no vetor da fila
Fila(indUltimo).Prox = indNovo;
Fila(indUltimo) = Novo;
16
Remover um elemento de uma Fila (RemoverFila)
Notas:
- esta operação só pode ser aplicada a uma fila não vazia; caso contrário, ocorrerá ERRO
- equivalente a remover o elemento de uma lista, o qual está no início da lista
Parâmetros:
Entrada: fila (Fila) e cabeça da fila (Cabeca)
Saída: fila com menos um nodo (Fila) e cabeça da fila atualizado (Cabeca)
Função implementada em MatLab:
Nota: LibertarNodoFila é uma operação auxiliar da EAD Fila
function [Fila, Cabeca] = RemoverFila (Fila, Cabeca)
% libertar o nodo que contém o elemento removido, que está na cabeça da fila
indNodo = Cabeca;
Cabeca = Fila(Cabeca).Prox;
Fila(indNodo).Prox = -1; % isolar e marcar o nodo a libertar
% libertar o nodo que (ainda) está no vetor da fila
[Fila, Cabeca] = LibertarNodoFila(Fila, Cabeca);
17
Consultar uma Fila (FrenteFila)
Notas:
- operação que só pode ser aplicada a uma fila não vazia; caso contrário, ocorrerá ERRO
- equivalente a consultar o elemento de uma lista que está no início da lista
Parâmetros:
Entrada: fila (Fila) e cabeça da fila (Cabeca)
Saída: mostra toda a informação sobre o elemento da cabeça da fila
Função implementada em MatLab:
Nota: MostrarElemento é uma operação específica do problema
function [] = FrenteFila (Fila, Cabeca)
MostrarElemento(Fila(Cabeca).Elemento);
18
Exemplo: Fila em que o elemento de cada nodo é um inteiro.
Estrutura de dados:
Fila(k) = struct { Elemento, Prox }, k = 1, ...
Fila é um tipo de dados estruturado (neste caso, do tipo registo);
Elemento é um tipo não estruturado básico (neste caso, do tipo inteiro).
Operações específicas deste problema a implementar (funções em MatLab):
function [Elem] = CriarElemento ()
Elem = input('Inserir um inteiro: ');
function [] = MostrarElemento(Elem)
disp(Elem);