Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Estruturas de Dados 1
Pilhas e filas
Disciplina restrita
acesso permitido somente em alguns
nodos
Estruturas de Dados 2
Pilhas e filas
Estruturas de Dados 3
Exclusões Inserções
Pilhas e Filas Consultas
Topo
PILHA
Base
FILA
Estruturas de Dados 4
Filas Duplas
inserções exclusões
exclusões inserções
Estruturas de Dados 5
Pilhas e filas
Pilhas
Estruturas de Dados 6
Pilhas
Topo
• Criar uma pilha vazia
• Inserir um nodo no topo da pilha
• Remover o nodo do topo de pilha
• Consultar / modificar nodo do topo da pilha
• Destruir a pilha Base
Estruturas de Dados 7
Pilhas
Estruturas de Dados 8
Pilha – contiguidade física
Base
Pilha
Índices
do arranjo
Estruturas de Dados 9
Pilha – contiguidade física
Estruturas de Dados 10
Pilha – contiguidade física
Operações
Estruturas de Dados 11
Pilha – contiguidade física
Criação da pilha
Lim 10
9
1. Definir valor do índice de BASE da pilha 8
2. Definir valor máximo de nodos que a pilha pode ter LIM 7
3. Indicar que a pilha está vazia através do valor de TOPO 6
5
Exemplo: 4
3
Base ← 1 2
Topo ← Base – 1 Base 1
Lim ← 6 Topo
Pilha
Estruturas de Dados 12
Pilha – contiguidade física
Algoritmo:
Inicializar Pilhas implementada sobre Arranjo
Estruturas de Dados 13
Pilha – contiguidade física
Inserção de um nodo na pilha
Operação PUSH
Lim 10 Lim 10
9 9
8 8
7 7
6 6
5 5
4 Topo 4
Topo
3 3
2 2
Base 1 Base 1
Pilha Pilha
Estruturas de Dados 14
Pilha – contiguidade física
Algoritmo:
Inicializar Pilhas implementada sobre Arranjo
Algoritmo 4.2 - InserirPilhaArr
Entradas: Pilha (TipoPilha)
Lim (inteiro)
Topo (inteiro)
Valor (TipoNodo)
Saídas: Pilha (TipoPilha)
Topo (inteiro)
Sucesso (lógico)
início
se Topo < Lim
então início
Topo ← Topo + 1
Pilha[Topo] ← Valor
Sucesso ← verdadeiro
fim
senão Sucesso ← falso
fim
Estruturas de Dados 15
Pilha – contiguidade física
Lim 10 Lim 10
9 9
8 8
7 7
6 6
Topo 5 5
4 Topo 4
3 3
2 2
Base 1 Base 1
Pilha Pilha
Estruturas de Dados 16
Algoritmo: Remover nodo do topo de Pilha
implementada sobre Arranjo
Algoritmo 4.3 - RemoverPilhaArr
Entradas: Pilha (TipoPilha)
Topo (inteiro)
Base (inteiro)
Saídas: Pilha (TipoPilha)
Topo (inteiro)
Sucesso (lógico)
ValorRemovido (TipoNodo)
início
se Topo ≥ Base
então início
ValorRemovido ← Pilha[Topo]
Topo ← Topo - 1
Sucesso ← verdadeiro
fim
senão Sucesso ← falso
fim
Estruturas de Dados 17
Pilha – contiguidade física
Acesso à pilha
Lim 10
9
• Somente ao nodo do topo da pilha 8
7
• Para consulta e/ou modificação
6
5
Topo ? 4
3
2
Base
1
Pilha
Estruturas de Dados 18
Algoritmo: Consultar nodo do topo de Pilha
implementada sobre Arranjo
Estruturas de Dados 19
Pilhas
Estruturas de Dados 20
Pilha implementada por encadeamento
remoções
Endereço do topo da inserções
PtPilha pilha ?
consultas
Topo da pilha
Base
Estruturas de Dados 21
Pilha por encadeamento
Estruturas de Dados 22
Pilha por encadeamento
Estruturas de Dados 23
Pilha por encadeamento
PtPilha PtPilha
Topo Novo
nodo
Topo
Topo
Base Base
Estruturas de Dados 24
Pilha por encadeamento
Estruturas de Dados 25
Pilha por encadeamento
Topo
Base Base
Estruturas de Dados 26
Pilha por encadeamento
Estruturas de Dados 27
Pilha por encadeamento
Topo
Base
Estruturas de Dados 28
Pilha por encadeamento
Algoritmo:
Consultar nodo do topo de Pilha Encadeada
Estruturas de Dados 29
Pilha por encadeamento
Algoritmo: Desempilhar
Consulta nodo do topo da pilha, e o remove da pilha
Algoritmo 4.9 - Desempilhar
Entrada: PtPilha (TipoPtNodo)
Saídas: PtPilha (TipoPtNodo)
Valor (TipoInfo)
Sucesso (lógico)
Variável local: PtAux (TipoPtNodo)
início
se PtPilha = nulo
então Sucesso ← falso
senão início
Sucesso ← verdadeiro
Valor ← PtPilha↑.Info
PtAux ← PtPilha
PtPilha ← PtPilha↑.Elo
liberar(PtAux)
fim
fim
Estruturas de Dados 30
Pilha por encadeamento
PtPilha
Topo
PtPilha
Topo
PtPilha
Topo
Topo
Estruturas de Dados 31
Pilha por encadeamento
Estruturas de Dados 32
Pilhas e filas
Filas
Estruturas de Dados 33
Filas
Filas
Início Final
Inserções
Exclusões
e
Consultas
Operações válidas:
• Criar uma fila vazia
• Inserir um nodo no final da fila
• Excluir o nodo do início da fila
• Consultar / modificar nodo do início da fila
• Destruir a fila
Estruturas de Dados 34
Filas
Estruturas de Dados 35
Fila por contiguidade
Exclusões
e
Consultas
Inserções
LI IF FF LS
1 2 3 4 5 6 7 8 9 10 12 13 14
FILA
Estruturas de Dados 36
Fila por contiguidade
Evolução da Fila
1 2 3 4 5 6
FILA
LI=IF=FF LS
1 2 3 4 5 6
FILA 3
2. Inicializar a fila
LI=IF FF LS
3. Inserir um novo nodo com valor 3 1 2 3 4 5 6
FILA
7 5
Estruturas de Dados 37
Fila por contiguidade
Ocupação circular do arranjo
IF
LI FF LS
1 2 3 4 5 6 7 8 9 10 12 13 14
FILA
LI IF FF LS
1 2 3 4 5 6 7 8 9 10 12 13 14
FILA
LI IF FF LS
1 2 3 4 5 6 7 8 9 10 12 13 14
FILA
FF
LI IF LS
1 2 3 4 5 6 7 8 9 10 12 13 14
FILA
LI FF IF LS
1 2 3 4 5 6 7 8 9 10 12 13 14
FILA
Estruturas de Dados 38
Fila por contiguidade
Estruturas de Dados 39
Fila por contiguidade
FF
... IF LI LS
...
FILA
Estruturas de Dados 40
Fila por contiguidade
Algoritmo:
Inicializar Fila implementada sobre Arranjo
Estruturas de Dados 41
Fila por contiguidade
IF
LI FF LS
... ... atrás
FF
LI IF LS
... ... na frente
LI FF IF LS
... ... no meio
Estruturas de Dados 42
Algoritmo: Inserir um nodo em uma Fila implementada
sobre Arranjo
Algoritmo 4.12 - InserirFilaArr
Entradas: Fila (TipoFila)
LI, LS, IF, FF (inteiros)
Info (TipoNodo)
Saídas: IF, FF (inteiros)
Sucesso (lógico)
início
se (FF ≠ IF - 1) e ((IF ≠ LI) ou (FF ≠ LS))
então início
se IF = LI - 1
então IF ← FF ← LI {INSERÇÃO DO PRIMEIRO NODO}
senão se FF = L
então FF ← LI {INSERÇÃO NO INÍCIO}
senão FF ← FF + 1 {INSERÇÃO NO MEIO OU ATRÁS}
FILA[FF] ← Info
Sucesso ← verdadeiro
fim
senão Sucesso ← falso
fim
Estruturas de Dados 43
Fila por contiguidade
LI IF FF LS
1 2 3 4 5 6 7 8 9 10 12 13 14
FILA
LI IF FF LS
1 2 3 4 5 6 7 8 9 10 12 13 14
FILA
Estruturas de Dados 44
Algoritmo: Remover um nodo de uma Fila implementada
sobre Arranjo
Algoritmo 4.13 - RemoverFilaArr
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
então IF ← FF ← LI - 1 {FILA FICA VAZIA}
senão se IF = LS
então IF ← LI
senão IF ← IF + 1
Sucesso ← verdadeiro
fim
senão Sucesso ← falso
fim
Estruturas de Dados 45
Fila por contiguidade
Acesso à fila
... ? ...
Estruturas de Dados 46
Fila por contiguidade
Algoritmo:
Consultar Fila implementada sobre Arranjo
Estruturas de Dados 47
Filas
Estruturas de Dados 48
Filas por encadeamento
Endereço do primeiro da
fila, para remoção
PtFila
Endereço do final da fila,
para inserção
Info Elo
F1 F2 F3 Fn
Estruturas de Dados 49
Filas por encadeamento
Prim Ult
L1 L2 L3 L4
Estruturas de Dados 50
Filas por encadeamento
Estruturas de Dados 51
Filas por encadeamento
PtDF
Prim Ult
Estruturas de Dados 52
Filas por encadeamento
Algoritmo:
Criar Fila Encadeada endereçada por descritor
Estruturas de Dados 53
Filas por encadeamento
PtDFila
Prim Ult
/
PtDFila PtDFila
Prim Ult Prim Ult
Estruturas de Dados 54
Filas por encadeamento
Algoritmo:
Inserir novo nodo em Fila Encadeada
endereçada por descritor
Estruturas de Dados 55
Filas por encadeamento
/
/
Estruturas de Dados 56
Filas por encadeamento
Algoritmo:
Remover um nodo de Fila Encadeada
endereçada por descritor
Algoritmo 4.17 - RemoverFilaEnc
Entrada: PtDFila (TipoPtDFila)
Saída: Sucesso (lógico)
Variável auxiliar: PtAux (TipoPtNodo)
início
se PtDFila↑.Prim ≠ nulo
então início
PtAux ← PtDFila↑.Prim
PtDFila↑.Prim ← PtAux↑.Elo
liberar(PtAux)
se PtDFila↑.Prim = nulo
então PtDFila↑.Ult ← nulo
Sucesso ← verdadeiro
fim
senão Sucesso ← falso
fim
Estruturas de Dados 57
Filas por encadeamento
? /
Estruturas de Dados 58
Filas por encadeamento
Algoritmo:
Consultar Fila Encadeada endereçada por descritor
Estruturas de Dados 59
Filas por encadeamento
PtDFila = nulo
Estruturas de Dados 60
Filas por encadeamento
Algoritmo:
Destruir Fila Encadeada endereçada por descritor
Algoritmo 4.19 - DestruirFilaEnc
Entrada: PtDFila (TipoPtDFila)
Saída: PtDFila (TipoPtDFila)
Variáveis auxiliares: P1, P2 (TipoPtNodo)
início
se PtDFila↑.Prim ≠ nulo
então início
P1 ← PtDFila↑.Prim
repita
P2 ← P1↑.Elo
liberar(P1)
P1 ← P2
até P1 = nulo
fim
liberar(PtDFila)
PtDFila ← nulo
fim
Estruturas de Dados 61
Filas
Estruturas de Dados 62
Fila dupla
I ns s
erç õe
õ es rç
Final In se
Início
Consultas Consultas
s Exc
sõe lus
ões
Ex clu
Estruturas de Dados 63
Fila dupla
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
Estruturas de Dados 64
Fila dupla
Estruturas de Dados 65
Fila dupla por contiguidade
LI IF FF LS
1 2 3 4 5 6 7 8 9 10 12 13 14
Deque
Estruturas de Dados 66
Fila dupla por contiguidade
Estruturas de Dados 67
Fila dupla por contiguidade
Algoritmo:
Inicializar Deque implementada sobre Arranjo
Estruturas de Dados 68
Fila dupla por contiguidade
Início Final
Inserção Inserção
Estruturas de Dados 69
Fila dupla por contiguidade
Inserção no final
LI IF FF LS
1 2 3 4 5 6 7 8 9 10 12 13 14
DEQUE
LI IF FF LS
1 2 3 4 5 6 7 8 9 10 12 13 14
DEQUE
FF
LI IF LS
1 2 3 4 5 6 7 8 9 10 12 13 14
DEQUE
Estruturas de Dados 70
Fila dupla por contiguidade
Inserção no início
LI IF FF LS
1 2 3 4 5 6 7 8 9 10 12 13 14
DEQUE
LI IF FF LS
1 2 3 4 5 6 7 8 9 10 12 13 14
DEQUE
IF
LI FF LS
1 2 3 4 5 6 7 8 9 10 12 13 14
DEQUE
Estruturas de Dados 71
Algoritmo: Inserir um nodo no Início de Deque
implementada sobre Arranjo
Algoritmo 4.21 - 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 72
Fila dupla por contiguidade
Início Final
Remoção Remoção
Estruturas de Dados 73
Algoritmo: Remover o nodo do Fim da Deque
implementada sobre Arranjo
Algoritmo 4.22 - 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 74
Fila dupla por contiguidade
Início Final
Acesso Acesso
Estruturas de Dados 75
Algoritmo: Consultar qual o Maior valor contido nas
extremidades de uma Deque implementada sobre Arranjo
Estruturas de Dados 76
Fila dupla
Estruturas de Dados 77
Fila dupla por encadeamento
Exclusões Exclusões
Inserções Inserções
Acesso Acesso
Início
PtFilaDupla
Final
F1 F2 F3 Fn
Estruturas de Dados 78
Fila dupla por encadeamento
Fila dupla encadeada com descritor
PtDFD
Prim Ult
Estruturas de Dados 79
Fila dupla por encadeamento
Estruturas de Dados 80
Fila dupla por encadeamento
• Alocação do descritor
• Inicialização do descritor para fila dupla vazia
PtDFD
Prim Ult
Estruturas de Dados 81
Fila dupla por encadeamento
Algoritmo:
Criar Deque implementada por Encadeamento
Estruturas de Dados 82
Fila dupla por encadeamento
PtDFD
Prim Ult
PtDFD ício
Prim Ult No in N A B C
No
fina
l
PtDFD
A B C Prim Ult
A B C N
Estruturas de Dados 83
Fila dupla por encadeamento
Estruturas de Dados 84
Algoritmo (cont): Inserir nodo em Deque Encadeada
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
Estruturas de Dados 85
Fila dupla por encadeamento
Remoção de um nodo
PtDFD
Prim Ult
PtDFD
X A B C Do Prim Ult
in íc
io
PtDFD
f i nal
Prim Ult Do
A B C
A B C X
Estruturas de Dados 86
Fila dupla por encadeamento
Estruturas de Dados 87
Algoritmo (cont.): Remover nodo de Deque Encadeada
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
Estruturas de Dados 88
Fila dupla por encadeamento
Início Final
Acesso Acesso
PtDFD
Prim Ult
X A B C
Estruturas de Dados 89
Fila dupla por encadeamento
Algoritmo:
Consultar Deque implementada por Encadeamento
Algoritmo 4.27 - 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 90