Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
Estruturas de Dados I
Filas
Fila dupla - Deque
Estruturas de Dados I
Consultas
Consultas
Início
Final
Exclusões
Inserções
Exclusões
Inserções
Fila dupla
Fila dupla - Deque
Inserção, remoção e acesso às duas extremidades
Estruturas de Dados I
Operações válidas:
Criar uma fila dupla vazia
Inserir um nodo no início
Inserir um nodo no fim
Excluir um nodo do início
Excluir um nodo do fim
Consultar / modificar nodo do início ou do fim
Destruir a fila dupla
Fila dupla
Fila dupla - Deque
Estruturas de Dados I
Fila dupla
Fila dupla implementada por contiguidade física
Estruturas de Dados I
LI : limite inferior da área no arranjo
IF : início da fila
FF : final da fila
LS : limite superior da área disponível
1 2 3 4 5 6 7 8 9 10 12 13 14
LI
LS
IF
FF
Deque
Fila dupla por contiguidade
Fila dupla implementada sobre arranjo
TipoFila = arranjo [1..N] de TipoNodo
Tipo de dados para fila dupla por contiguidade:
Estruturas de Dados I
Criação de uma fila dupla
Inicializar indicadores de início e final da fila dupla
Fila criada vazia
0 1 2 3 4 5 6 7 8 9 10 12 13 14
LI
LS
IF
FF
Deque
Fila dupla por contiguidade
Estruturas de Dados I
Algoritmo:
Inicializar Deque implementada sobre Arranjo
Algoritmo InicializarDequeArr
Entrada: LI (inteiro)
Saídas: IF, FF (inteiros)
início
IF FF LI – 1
fim
Fila dupla por contiguidade
Estruturas de Dados I
Inserção de um nodo em uma fila dupla
Fila dupla por contiguidade
A inserção pode ser feita em qualquer uma das duas extremidades
Definir em qual extremidade deve ser inserido o novo nodo
Ocupação circular do arranjo
Início
Final
Inserção
Inserção
Estruturas de Dados I
LS
FF
LI
DEQUE
1 2 3 4 5 6 7 8 9 10 12 13 14
LS
FF
IF
LI
1 2 3 4 5 6 7 8 9 10 12 13 14
IF
LS
FF
LI
1 2 3 4 5 6 7 8 9 10 12 13 14
LS
FF
IF
LI
1 2 3 4 5 6 7 8 9 10 12 13 14
IF
DEQUE
DEQUE
DEQUE
Inserção no final
Ocupação circular do arranjo:
Fila dupla por contiguidade
Estruturas de Dados I
LS
FF
LI
DEQUE
1 2 3 4 5 6 7 8 9 10 12 13 14
LS
FF
IF
LI
1 2 3 4 5 6 7 8 9 10 12 13 14
IF
LS
FF
LI
1 2 3 4 5 6 7 8 9 10 12 13 14
LS
FF
IF
LI
1 2 3 4 5 6 7 8 9 10 12 13 14
IF
DEQUE
DEQUE
DEQUE
Inserção no início
Ocupação circular do arranjo:
Fila dupla por contiguidade
Estruturas de Dados I
Algoritmo: Inserir um nodo no Início de Deque implementada sobre Arranjo
Algoritmo InserirIniDequeArr
Entrada: Deque (TipoDequeArr)
LI, LS, IF, FF (inteiros)
Info (TipoNodo)
Saídas: Deque (TipoDequeArr)
IF, FF (inteiros)
Sucesso (lógico)
início
se ((FF = IF - 1) ou ((IF = LI) e (FF = LS)))
então Sucesso falso
senão início
Sucesso verdadeiro
se IF = LI – 1 {DEQUE VAZIA}
então IF FF LI
senão se IF > LI
então IF IF – 1
senão IF LS
Deque[IF] Info
fim
fim
Estruturas de Dados I
Remoção de um nodo de uma fila dupla
Fila dupla por contiguidade
A remoção pode ser feita em qualquer uma das duas extremidades
Definir de qual extremidade deve ser removido o novo nodo
Início
Final
Remoção
Remoção
Estruturas de Dados I
Algoritmo: Remover o nodo do Fim da Deque implementada sobre Arranjo
Algoritmo RemoverFimDequeArr
Entradas: LI, LS, IF, FF (inteiros)
Saídas: IF, FF (inteiros)
Sucesso (lógico)
início
se IF LI – 1
então início
se IF = FF {DEQUE VAI FICAR VAZIA}
então IF FF LI - 1
senão se FF = LI
então FF LS
senão FF FF - 1
Sucesso verdadeiro
fim
senão Sucesso falso
fim
Estruturas de Dados I
Acesso a uma fila dupla
Fila dupla por contiguidade
Início
Final
Acesso
Acesso
Somente os nodos das duas extremidades podem ser acessados
Estruturas de Dados I
Algoritmo: Consultar qual o Maior valor contido nas extremidades de uma Deque implementada sobre Arranjo
Algoritmo ConsultarMaiorDequeArr
Entradas: Deque (TipoDequeArr)
LI, IF, FF (inteiros)
Saída: MaiorValor (inteiro)
início
se IF = LI - 1
então MaiorValor 0
senão se Deque[IF] > Deque[FF]
então MaiorValor Deque[IF]
senão MaiorValor Deque[FF]
fim
Estruturas de Dados I
Fila dupla
Fila dupla implementada por contiguidade física
Estruturas de Dados I
PtFilaDupla
Início
Final
Exclusões
Inserções
Acesso
Exclusões
Fila dupla implementada por encadeamento
Fila dupla por encadeamento
Inserções
Acesso
Para acessar o último nodo, é necessário percorrer toda a lista a partir do primeiro nodo
Estruturas de Dados I
PtDFD
/
Prim Ult
Fila dupla encadeada com descritor
Fila dupla por encadeamento
Na remoção do último nodo, precisa atualizar descritor que passará a apontar para o penúltimo – percorrer a fila do início para chegar ao penúltimo
Estruturas de Dados I
PtDFD
TipoNodo = registro
Ant: TipoPtNodo
Info: TipoInfoNodo
Prox: TipoPtNodo
fim registro
Tipo de dados para nodos da fila dupla:
TipoDDeque = registro
Prim: TipoPtNodo
Ult: TipoPtNodo
fim registo
TipoPtDDeque = TipoDDeque
Tipo de dados para o descritor da fila dupla:
Descritor
Prim: primeiro da fila
Ult : último da fila
Prim Ult
Ant Info Prox
Fila dupla – duplo encadeamento e descritor
Fila dupla por encadeamento
Estruturas de Dados I
Criação de fila dupla encadeada
Fila dupla por encadeamento
Alocação do descritor
Inicialização do descritor para fila dupla vazia
PtDFD
Prim Ult
Estruturas de Dados I
Algoritmo CriarDequeEnc
Entradas: -
Saída: PtDDeque (TipoPtDDeque)
início
alocar(PtDDeque)
PtDDeque.Prim PtDDdeque.Ult nulo
fim
Algoritmo:
Criar Deque implementada por Encadeamento
Fila dupla por encadeamento
Estruturas de Dados I
Inserção de um novo nodo
Fila dupla por encadeamento
PtDFD
Prim Ult
PtDFD
Prim Ult
A
C
A
B
B
N
N
C
PtDFD
Prim Ult
C
A
B
No início
No final
Estruturas de Dados I
Algoritmo:
Inserir nodo em Deque Encadeada
Algoritmo InserirDequeEnc
Entradas: PtDeque (TipoPtDeque)
Lado (caractere)
Valor (TipoInfoNodo)
Saída: Sucesso (lógico)
var PtNovo (TipoPtNodo)
início
Sucesso falso
se (Lado = “I”) ou (Lado = “F”)
então início
Sucesso verdadeiro
alocar(PtNovo)
PtNovo.Info Valor
se Lado = “I”
{ então início {INSERE NO INÍCIO} SEGUE }
Fila dupla por encadeamento
Estruturas de Dados I
então início {INSERE NO INÍCIO}
PtNovo.Ant nulo
se PtDDeque.Prim = nulo
então início
PtDDeque.Ult PtNovo
PtNovo.Prox nulo
fim
senão início
PtNovo.Prox PtDDeque.Prim
(PtDDeque.Prim).Ant PtNovo
fim
PtDDeque.Prim PtNovo
fim
senão início {INSERE NO FINAL}
PtNovo.Prox nulo
se PtDDeque.Prim
= nulo
então início
PtNovo.Ant nulo
PtDDeque.Prim PtNovo
fim
senão início
(PtDDeque.Ult).Prox PtNovo
PtNovo.Ant PtDDeque.Ult
fim
PtDDeque.Ult PtNovo
fim
fim
fim
Algoritmo (cont): Inserir nodo em Deque Encadeada
Estruturas de Dados I
Remoção de um nodo
Fila dupla por encadeamento
PtDFD
Prim Ult
PtDFD
Prim Ult
A
C
A
B
B
X
X
C
Do final
Do início
Estruturas de Dados I
Algoritmo:
Remover nodo de Deque Encadeada
Fila dupla por encadeamento
Algoritmo RemoverDequeEnc
Entradas: PtDDeque (TipoPtDDeque)
Lado (caractere)
Saída: Sucesso (lógico)
var PtAux, PtAnt (TipoPtNodo);
início
Sucesso falso
se (PtDDeque.Prim nulo) e ((Lado = “I”) ou (Lado = “F”))
então início
Sucesso verdadeiro
se Lado = “I”
{ então início {REMOVE O PRIMEIRO} SEGUE }
Estruturas de Dados I
então início {REMOVE O PRIMEIRO}
PtAux PtDDeque.Prim
se PtDDeque.Prim = PtDDeque.Ult
então PtDDeque.Prim PtDDeque.Ult nulo
senão início
PtDDeque.Prim PtAux.Prox
(PtDDeque.Prim).Ant nulo
fim
fim
senão início {REMOVE O ÚLTIMO}
PtAux PtDDeque.Ult
se PtDDeque.Prim = PtDDeque.Ult
então PtDDeque.Prim PtDDeque.Ult nulo
senão início
PtDDeque.Ult PtAux.Ant
(PtDDeque.Ult).Prox nulo
fim
fim
liberar(PtAux)
fim
fim
Algoritmo (cont):
Remover nodo de Deque Encadeada
Estruturas de Dados I
Acesso a fila dupla encadeada
Fila dupla por encadeamento
Início
Final
Acesso
Acesso
PtDFD
Prim Ult
C
A
B
X
Apodem ser acessados o primeiro e último nodo
Endereços diretamente no descritor
Estruturas de Dados I
Algoritmo:
Consultar Deque implementada por Encadeamento
Fila dupla por encadeamento
Algoritmo ConsultarDequeEnc
Entradas: PtDDeque (TipoPtDDeque)
Lado (caractere)
Saídas: Valor (TipoInfoNodo)
Sucesso (lógico)
início
Sucesso falso
se (PtDDeque.Prim nulo) e ((Lado = “I”) ou (Lado = “F”))
então início
Sucesso verdadeiro
se Lado = “I”
então Valor (PtDDeque.Prim).Info
senão Valor (PtDDeque.Ult).Info;
fim
fim
Estruturas de Dados I
Exercícios
Filas por encadeamento
1. O Algoritmo InserirIniDequeArr insere um novo nodo na extremidade da frente de uma fila dupla. Construa outro algoritmo que insira um novo nodo na outra extremidade, ou seja, no final da fila dupla.
Estruturas de Dados I
Exercícios
Filas por encadeamento
2. O Algoritmo RemoverFimDequeArr remove o nodo que está no final de uma fila dupla. Construa outro algoritmo que remova o nodo que está na frente desta mesma fila dupla.
Estruturas de Dados I
Exercícios
Filas por encadeamento
3. Considerando uma fila dupla implementada por contigüidade física com ocupação circular do espaço disponível, construa algoritmo para informar o valor contido em uma das extremidades da fila dupla. A extremidade considerada deve ser passada como parâmetro.
Estruturas de Dados I
Exercícios
Filas por encadeamento
4. Reescreva as operações definidas para filas duplas encadeadas, para o caso em que não seja utilizado um descritor para a fila. Considere que somente o endereço do primeiro nodo da fila dupla é conhecido, e que não existe duplo encadeamento entre os nodos.
*