inserção de um novo elemento na fila remoção de um ... · 5 estrutura de dados: - fila é um...

18

Click here to load reader

Upload: nguyentruc

Post on 08-Feb-2019

212 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Inserção de um novo elemento na Fila Remoção de um ... · 5 Estrutura de dados: - Fila é um vetor em que cada componente (nodo) é composto por 2 campos: - Elemento (informação

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.

Page 2: Inserção de um novo elemento na Fila Remoção de um ... · 5 Estrutura de dados: - Fila é um vetor em que cada componente (nodo) é composto por 2 campos: - Elemento (informação

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

Page 3: Inserção de um novo elemento na Fila Remoção de um ... · 5 Estrutura de dados: - Fila é um vetor em que cada componente (nodo) é composto por 2 campos: - Elemento (informação

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.

Page 4: Inserção de um novo elemento na Fila Remoção de um ... · 5 Estrutura de dados: - Fila é um vetor em que cada componente (nodo) é composto por 2 campos: - Elemento (informação

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

Page 5: Inserção de um novo elemento na Fila Remoção de um ... · 5 Estrutura de dados: - Fila é um vetor em que cada componente (nodo) é composto por 2 campos: - Elemento (informação

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

Page 6: Inserção de um novo elemento na Fila Remoção de um ... · 5 Estrutura de dados: - Fila é um vetor em que cada componente (nodo) é composto por 2 campos: - Elemento (informação

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

Page 7: Inserção de um novo elemento na Fila Remoção de um ... · 5 Estrutura de dados: - Fila é um vetor em que cada componente (nodo) é composto por 2 campos: - Elemento (informação

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)

Page 8: Inserção de um novo elemento na Fila Remoção de um ... · 5 Estrutura de dados: - Fila é um vetor em que cada componente (nodo) é composto por 2 campos: - Elemento (informação

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;

Page 9: Inserção de um novo elemento na Fila Remoção de um ... · 5 Estrutura de dados: - Fila é um vetor em que cada componente (nodo) é composto por 2 campos: - Elemento (informação

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;

Page 10: Inserção de um novo elemento na Fila Remoção de um ... · 5 Estrutura de dados: - Fila é um vetor em que cada componente (nodo) é composto por 2 campos: - Elemento (informação

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;

Page 11: Inserção de um novo elemento na Fila Remoção de um ... · 5 Estrutura de dados: - Fila é um vetor em que cada componente (nodo) é composto por 2 campos: - Elemento (informação

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;

Page 12: Inserção de um novo elemento na Fila Remoção de um ... · 5 Estrutura de dados: - Fila é um vetor em que cada componente (nodo) é composto por 2 campos: - Elemento (informação

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;

Page 13: Inserção de um novo elemento na Fila Remoção de um ... · 5 Estrutura de dados: - Fila é um vetor em que cada componente (nodo) é composto por 2 campos: - Elemento (informação

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;

Page 14: Inserção de um novo elemento na Fila Remoção de um ... · 5 Estrutura de dados: - Fila é um vetor em que cada componente (nodo) é composto por 2 campos: - Elemento (informação

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)

Page 15: Inserção de um novo elemento na Fila Remoção de um ... · 5 Estrutura de dados: - Fila é um vetor em que cada componente (nodo) é composto por 2 campos: - Elemento (informação

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;

Page 16: Inserção de um novo elemento na Fila Remoção de um ... · 5 Estrutura de dados: - Fila é um vetor em que cada componente (nodo) é composto por 2 campos: - Elemento (informação

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);

Page 17: Inserção de um novo elemento na Fila Remoção de um ... · 5 Estrutura de dados: - Fila é um vetor em que cada componente (nodo) é composto por 2 campos: - Elemento (informação

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);

Page 18: Inserção de um novo elemento na Fila Remoção de um ... · 5 Estrutura de dados: - Fila é um vetor em que cada componente (nodo) é composto por 2 campos: - Elemento (informação

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);