REVISÃO DE PILHAS E FILAS Vanessa Braganholo Estruturas 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 inserções exclusões consultas INSTITUTO DE COMPUTAÇÃO - UFF 4
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);
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 inserções exclusões consultas topo base
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 VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós lim base topo 9 8 7 6 5 4 3 2 1 0
EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2. Inserir nó com valor 3 lim topo base 9 8 7 6 5 4 3 2 1 3 0
EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2. Inserir nó com valor 3 3. Inserir nó com valor 7 lim topo base 9 8 7 6 5 4 3 2 7 1 3 0
EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. 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 lim topo base 9 8 7 6 5 4 3 5 2 7 1 3 0
EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. 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) lim topo base 9 8 7 6 5 4 3 2 7 1 3 0
EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. 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) lim topo base 9 8 7 6 5 4 3 2 7 1 3 0
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ÇÃO void inicializa(int *base, int *lim, int *topo) { *base = 0; *lim = 9; *topo = -1; int main() { TPilha pilha[10]; inicializa(&base, &lim, &topo);... lim base topo 9 8 7 6 5 4 3 2 1 0 INSTITUTO DE COMPUTAÇÃO - UFF 17
CRIAÇÃO DO VETOR NA FUNÇÃO MAIN E INICIALIZAÇÃO void inicializa(int *base, int *lim, int *topo) { *base = 0; *lim = 9; *topo = -1; int main() { TPilha pilha[10]; inicializa(&base, &lim, &topo);... Note o uso de ponteiros para permitir alteração das variáveis base, lim e topo. INSTITUTO DE COMPUTAÇÃO - UFF 18
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 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. INSTITUTO DE COMPUTAÇÃO - UFF 20
CHECAR SE PILHA ESTÁ CHEIA int pilha_cheia(int lim, int topo) { if (topo == lim) return 1; else return 0; topo lim base 2 9 3 8 10 7 8 6 1 5 3 4 5 3 7 2 4 1 5 0 INSTITUTO DE COMPUTAÇÃO - UFF 21
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ção int 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 vazia else return 0; //pilha não vazia lim base topo 9 8 7 6 5 4 3 2 1 0 INSTITUTO DE COMPUTAÇÃO - UFF 23
CONSULTAR TOPO DA PILHA: PEEK int peek(tpilha *pilha, int base, int *topo) { if (pilha_vazia(base, *topo)) return -1; //pilha vazia else { //faz consulta return pilha[*topo].info; lim topo base 9 8 7 6 5 4 3 7 2 4 1 5 0 INSTITUTO DE COMPUTAÇÃO - UFF 24
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 PILHA COM LISTA ENCADEADA topo info 5 prox #include "lista-encadeada.h" 7 typedef struct pilha{ TLista *topo; TPilha; 2 4 8 1 λ
INICIALIZA pilha topo λ TPilha *inicializa() { TPilha *pilha = (TPilha *)malloc(sizeof(tpilha)); pilha->topo = NULL; return pilha; int main() { TPilha *pilha = inicializa();... INSTITUTO DE COMPUTAÇÃO - UFF 28
novo info 2 prox PUSH pilha topo 4 /* * * 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; 8 1 λ INSTITUTO DE COMPUTAÇÃO - UFF 29
CHAMADA DO PUSH NA FUNÇÃO MAIN pilha int main() { TPilha *pilha = inicializa(); push(pilha, 5);... topo info 5 prox λ INSTITUTO DE COMPUTAÇÃO - UFF 30
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 inserções exclusões consultas INSTITUTO DE COMPUTAÇÃO - UFF 34
DECLARAÇÃO #include "lista-encadeada.h" typedef struct fila { TLista *inicio; TLista *fim; TFila; inicio fim 5 3 2 INSTITUTO DE COMPUTAÇÃO - UFF 35
novo INSERÇÃO (SEMPRE NO FIM) inicio fim 5 3 2 4 void insere(tfila *f, int elem){ TLista *novo = (TLista *)malloc(sizeof(tlista)); novo->info = elem; novo->prox = NULL; //inserção no fim da fila if (!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
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) inicio fim 5 3 2 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ém if (f->inicio == NULL) { f->fim = NULL; free(aux); return info; INSTITUTO DE COMPUTAÇÃO - UFF 38
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