REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE...
Transcript of REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE...
REVISÃO DE PILHAS E FILAS Vanessa BraganholoEstruturas de Dados e Seus Algoritmos
PILHAS E FILAS
São tipos especiais de listas com disciplina restrita de acesso
Acesso
Consulta
Inserção
Remoção
Disciplina Restrita
Acesso permitido a
apenas alguns nós
PILHAS
PILHAS
Todas as operações são executadas na mesma extremidade da pilha: o último componente inserido é o primeiro a ser retirado
LIFO: Last In, First Out
INSTITUTO DE COMPUTAÇÃO - UFF 4
consultas
exclusões
inserções
EXEMPLO DE APLICAÇÃO: RECURSÃO
void recursiveFunction(int num){
if (num < 5){
recursiveFunction(num + 1);printf("%d\n", num);
}}
int main() {recursiveFunction(0);
}
RECURSÃO
void recursiveFunction(int num){
if (num < 5){
recursiveFunction(num + 1);printf("%d\n", num);
}}
int main() {recursiveFunction(0);
}
consultas
exclusões
inserçõesbasetopo
OPERAÇÕES SOBRE PILHAS
Operações válidas: Criar uma pilha vazia Inserir um nó no topo da pilha Excluir o nó do topo da pilha Consultar/Modificar o nó do topo da pilha Destruir a pilha
ALTERNATIVAS DE IMPLEMENTAÇÃO
Vetores
Listas Encadeadas
INSTITUTO DE COMPUTAÇÃO - UFF 8
IMPLEMENTAÇÃO DE PILHAS COM VETORES
INSTITUTO DE COMPUTAÇÃO - UFF 9
EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR1. Inicializar pilha de inteiros com máximo de 10 nós
9
8
7
6
5
4
3
2
1
0
lim
topo
base
EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR1. Inicializar pilha de inteiros com máximo de 10 nós
2. Inserir nó com valor 39
8
7
6
5
4
3
2
1
3 0
lim
topobase
EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR1. Inicializar pilha de inteiros com máximo de 10 nós
2. Inserir nó com valor 3
3. Inserir nó com valor 7
9
8
7
6
5
4
3
2
7 1
3 0
lim
topo
base
EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR1. Inicializar pilha de inteiros com máximo de 10 nós
2. Inserir nó com valor 3
3. Inserir nó com valor 7
4. Inserir nó com valor 5
9
8
7
6
5
4
3
5 2
7 1
3 0
lim
topo
base
EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR1. Inicializar pilha de inteiros com máximo de 10 nós
2. Inserir nó com valor 3
3. Inserir nó com valor 7
4. Inserir nó com valor 5
5. Remover nó (nó removido é sempre o nó do topo)
9
8
7
6
5
4
3
2
7 1
3 0
lim
topo
base
EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR1. Inicializar pilha de inteiros com máximo de 10 nós
2. Inserir nó com valor 3
3. Inserir nó com valor 7
4. Inserir nó com valor 5
5. Remover nó (nó removido é sempre o nó do topo)
6. Consultar pilha (Retorna 7)
9
8
7
6
5
4
3
2
7 1
3 0
lim
topo
base
DECLARAÇÃO EM C
typedef struct pilha {int info;
} TPilha;
int base, lim, topo;
INSTITUTO DE COMPUTAÇÃO - UFF 16
CRIAÇÃO DO VETOR NA FUNÇÃO MAIN E INICIALIZAÇÃOvoid inicializa(int *base, int *lim, int *topo) {
*base = 0;*lim = 9;*topo = -1;
}
int main() {TPilha pilha[10];inicializa(&base, &lim, &topo);...
}
INSTITUTO DE COMPUTAÇÃO - UFF 17
9
8
7
6
5
4
3
2
1
0
lim
topo
base
CRIAÇÃO DO VETOR NA FUNÇÃO MAIN E INICIALIZAÇÃOvoid inicializa(int *base, int *lim, int *topo) {
*base = 0;*lim = 9;*topo = -1;
}
int main() {TPilha pilha[10];inicializa(&base, &lim, &topo);...
}
INSTITUTO DE COMPUTAÇÃO - UFF 18
Note o uso de ponteiros para permitir alteração das variáveis
base, lim e topo.
INSERÇÃO DE ELEMENTO: PUSH
int push(TPilha *pilha, int lim, int *topo, int info) {if (pilha_cheia(lim, *topo)) {
return -1; //pilha está cheia, inserção inválida}else {
//faz a inserção*topo = *topo + 1;pilha[*topo].info = info;return info; //retorna elemento inserido
}}
INSTITUTO DE COMPUTAÇÃO - UFF 19
INSERÇÃO DE ELEMENTO: PUSH
int push(TPilha *pilha, int lim, int *topo, int info) {if (pilha_cheia(lim, *topo)) {
return -1; //pilha está cheia, inserção inválida}else {
//faz a inserção*topo = *topo + 1;pilha[*topo].info = info;return info; //retorna elemento inserido
}}
INSTITUTO DE COMPUTAÇÃO - UFF 20
Variáveis lim e info não serão alteradas (então não são
ponteiros). Variável topo será alterada, então é ponteiro. Variável p é vetor, então é
ponteiro.
CHECAR SE PILHA ESTÁ CHEIA
int pilha_cheia(int lim, int topo) {if (topo == lim)
return 1;else
return 0;}
INSTITUTO DE COMPUTAÇÃO - UFF 21
2 9
3 8
10 7
8 6
1 5
3 4
5 3
7 2
4 1
5 0
limtopo
base
REMOÇÃO DE ELEMENTO: POP
int pop(TPilha *pilha, int base, int *topo) {if (pilha_vazia(base, *topo)) {
return -1; //pilha vazia, remoção inválida}else {
//faz a remoçãoint info = pilha[*topo].info;*topo = *topo - 1;return info; //retorna elemento removido
}}
INSTITUTO DE COMPUTAÇÃO - UFF 22
CHECAR SE PILHA ESTÁ VAZIA
int pilha_vazia(int base, int topo) {if (topo < base)
return 1; //pilha vaziaelse
return 0; //pilha não vazia
}
INSTITUTO DE COMPUTAÇÃO - UFF 23
9
8
7
6
5
4
3
2
1
0
lim
topo
base
CONSULTAR TOPO DA PILHA: PEEK
int peek(TPilha *pilha, int base, int *topo) {if (pilha_vazia(base, *topo))
return -1; //pilha vaziaelse {
//faz consultareturn pilha[*topo].info;
}}
INSTITUTO DE COMPUTAÇÃO - UFF 24
9
8
7
6
5
4
3
7 2
4 1
5 0
lim
topo
base
IMPLEMENTAÇÃO COMPLETA
A implementação completa está no site da disciplina
INSTITUTO DE COMPUTAÇÃO - UFF 25
IMPLEMENTAÇÃO DE PILHAS COM LISTAS ENCADEADAS
INSTITUTO DE COMPUTAÇÃO - UFF 26
PILHA COM LISTA ENCADEADA
8
4
2
7
1
5topoinfo prox
#include "lista-encadeada.h"
typedef struct pilha{TLista *topo;
} TPilha;
λ
pilha
INICIALIZA
TPilha *inicializa() {TPilha *pilha = (TPilha *)malloc(sizeof(TPilha));pilha->topo = NULL;return pilha;
}
int main() {TPilha *pilha = inicializa();...
}
INSTITUTO DE COMPUTAÇÃO - UFF 28
topo λpilha
PUSH
/* ** Insere elem no topo da pilha* */
void push(TPilha *pilha, int elem) {TLista *novo = (TLista*) malloc(sizeof(TLista));novo->info = elem;novo->prox = pilha->topo;pilha->topo = novo;
}
INSTITUTO DE COMPUTAÇÃO - UFF 29
8
4
2
1
novoinfo prox
λ
topopilha
CHAMADA DO PUSH NA FUNÇÃO MAIN
int main() {TPilha *pilha = inicializa();push(pilha, 5);...
}
INSTITUTO DE COMPUTAÇÃO - UFF 30
5topoinfo prox
λ
pilha
EXERCÍCIO: IMPLEMENTAR O POP
/* ** Exclui o elemento do topo da pilha* retorna o info do elemento excluído*/
int pop(TPilha *pilha) {//TODO
}
INSTITUTO DE COMPUTAÇÃO - UFF 31
EXERCÍCIO: IMPLEMENTAR O PEEK
/* ** Consulta o elemento do topo da pilha* retorna info do elemento do topo*/
int peek(TPilha *pilha) {//TODO
}
INSTITUTO DE COMPUTAÇÃO - UFF 32
FILAS
FILAS
Inserções são executadas em uma extremidade, e exclusões na outra: o primeiro componente inserido é o primeiro a ser retirado
FIFO: First In, First Out
INSTITUTO DE COMPUTAÇÃO - UFF 34
consultas
exclusõesinserções
DECLARAÇÃO
#include "lista-encadeada.h"
typedef struct fila {TLista *inicio;TLista *fim;
} TFila;
INSTITUTO DE COMPUTAÇÃO - UFF 35
5 3 2
inicio fim
INSERÇÃO (SEMPRE NO FIM)void insere(TFila *f, int elem){
TLista *novo = (TLista *)malloc(sizeof(TLista));novo->info = elem;novo->prox = NULL; //inserção no fim da filaif (!fila_vazia(f)){
f->fim->prox = novo;}else{
f->inicio = novo;}f->fim = novo; //elt. novo é o novo fim da fila
}
INSTITUTO DE COMPUTAÇÃO - UFF 36
5 3 2inicio
4
novo
fim
FILA VAZIA
int fila_vazia(TFila *f){if (f->inicio == NULL) {
return 1;}else return 0;
}
INSTITUTO DE COMPUTAÇÃO - UFF 37
RETIRAR ELEMENTO DA FILA (SEMPRE DO INÍCIO)int retira(TFila *f){
if (fila_vazia(f)){exit(1);
}int info = f->inicio->info;
TLista *aux = f->inicio;f->inicio=f->inicio->prox;//se elemento removido era o único da fila//faz fim apontar para NULL tambémif (f->inicio == NULL) {
f->fim = NULL;}free(aux);return info;
}
INSTITUTO DE COMPUTAÇÃO - UFF 38
5 3 2inicio
fim
EXERCÍCIOS
1. Faça uma função que imprime o conteúdo da fila, usando as funções de inserção e remoção (ver especificação no Google Classroom)
2. Faça uma função que altera o elemento do início da fila (ver especificação no Google Classroom)
3. Faça uma função que altera o elemento do topo da pilha (ver especificação no Google Classroom)
INSTITUTO DE COMPUTAÇÃO - UFF 39
AGRADECIMENTOS
Material baseado nos slides de Renata Galante
Instituto de Informática, UFRGS
Agradecimento a Isabel Rosseti pela implementação
INSTITUTO DE COMPUTAÇÃO - UFF 40