• Nenhum resultado encontrado

02-Revisao-Pilhas-Fi..>

N/A
N/A
Protected

Academic year: 2021

Share "02-Revisao-Pilhas-Fi..>"

Copied!
40
0
0

Texto

(1)

REVISÃO DE PILHAS E FILAS

Vanessa Braganholo

Estruturas de Dados e Seus Algoritmos

(2)

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

(3)
(4)

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

(5)

EXEMPLO DE APLICAÇÃO: RECURSÃO

void recursiveFunction(int num) { if (num < 5) { recursiveFunction(num + 1); printf("%d\n", num); } } int main() { recursiveFunction(0); }

(6)

RECURSÃO

void recursiveFunction(int num) { if (num < 5) { recursiveFunction(num + 1); printf("%d\n", num); } } int main() { recursiveFunction(0); }

(7)

exclusões

inserções

base

topo

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

(8)

ALTERNATIVAS DE IMPLEMENTAÇÃO

Vetores

Listas Encadeadas

(9)

IMPLEMENTAÇÃO DE PILHAS

COM VETORES

(10)

EXEMPLO DE MANIPULAÇÃO DE PILHA COM

VETOR

1. Inicializar pilha de inteiros com máximo de 10 nós

9 8 7 6 5 4 3 2 1 0 lim topo base

(11)

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

9 8 7 6 5 4 3 2 1 3 0 lim topo base

(12)

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

9 8 7 6 5 4 3 2 7 1 3 0 lim topo base

(13)

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

9 8 7 6 5 4 3 5 2 7 1 3 0 lim topo base

(14)

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)

9 8 7 6 5 4 3 2 7 1 3 0 lim topo base

(15)

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)

9 8 7 6 5 4 3 2 7 1 3 0 lim topo base

(16)

DECLARAÇÃO EM C

typedef struct pilha { int info;

} TPilha;

int base, lim, topo;

(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); ... } 9 8 7 6 5 4 3 2 1 0 lim topo base

(18)

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

}

INSTITUTO DE COMPUTAÇÃO - UFF 18

Note o uso de ponteiros para

permitir alteração das variáveis

(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 }

(20)

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 é

(21)

CHECAR SE PILHA ESTÁ CHEIA

int pilha_cheia(int lim, int topo) { if (topo == lim) return 1; else return 0; } 2 9 3 8 10 7 8 6 1 5 3 4 5 3 7 2 4 1 5 0 lim topo base

(22)

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 }

}

(23)

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 } 9 8 7 6 5 4 3 2 1 0 lim topo base

(24)

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

}

INSTITUTO DE COMPUTAÇÃO - UFF 24

9 8 7 6 5 4 3 7 2 4 1 5 0 lim topo base

(25)

IMPLEMENTAÇÃO COMPLETA

(26)

IMPLEMENTAÇÃO DE PILHAS

COM LISTAS ENCADEADAS

(27)

PILHA COM LISTA ENCADEADA

8 4 2 7 1 5

topo

info prox #include "lista-encadeada.h" typedef struct pilha{

TLista *topo; } TPilha;

(28)

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

λ

(29)

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; } 8 4 2 1

novo

info prox

λ

topo

pilha

(30)

CHAMADA DO PUSH NA FUNÇÃO MAIN

int main() {

TPilha *pilha = inicializa(); push(pilha, 5);

... }

INSTITUTO DE COMPUTAÇÃO - UFF 30

5

topo

info prox

λ

(31)

EXERCÍCIO: IMPLEMENTAR O POP

/* *

* Exclui o elemento do topo da pilha * retorna o info do elemento excluído */

int pop(TPilha *pilha) { //TODO

(32)

EXERCÍCIO: IMPLEMENTAR O PEEK

/* *

* Consulta o elemento do topo da pilha * retorna info do elemento do topo

*/

int peek(TPilha *pilha) { //TODO

}

(33)
(34)

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ões

inserções

(35)

DECLARAÇÃO

#include "lista-encadeada.h" typedef struct fila {

TLista *inicio; TLista *fim;

} TFila;

5 3 2

(36)

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

5 3 2

inicio

4

novo fim

(37)

FILA VAZIA

int fila_vazia(TFila *f){ if (f->inicio == NULL) { return 1; } else return 0; }

(38)

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ém

if (f->inicio == NULL) { f->fim = NULL; } free(aux); return info; }

INSTITUTO DE COMPUTAÇÃO - UFF 38

5 3 2

inicio

(39)

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

(40)

AGRADECIMENTOS

Material baseado nos slides de Renata Galante Instituto de Informática, UFRGS

Agradecimento a Isabel Rosseti pela implementação

Referências

Documentos relacionados

Mas tem uma coisa que você pode fazer para diminuir esse desperdício de energia: ativar o Gerenciador de Energia do seu computador.. A nossa organização, AJA Brasil, é parceira

Esse trabalho constatou a primeira evidência descrita para Molossidae e também para a Ordem Chiroptera do padrão de dimorfismo sexual, no qual as fêmeas possuem medidas maiores

A nomenclatura Green Vehicle Routing Problem – GVRP ´e adotada para Problemas de Roteamento de Ve´ıculos que incluem em sua formulac¸˜ao matem´atica quest˜oes ambientais,

D ‟‟ Elia Júnior (2010) ressalta que Elia Júnior (2010) ressalta que ““ não existe até a atualidade nenhum documento  não existe até a atualidade nenhum documento 

Observando as recomendações das organizações competentes referente à saúde e à biblioteca universitária, iremos abrir para a circulação e utilização do público a

Desconsiderar e não saber lidar com a realidade do comportamento suicida infantojuvenil têm se revelado um importante entrave clínico e epi- demiológico para a assistência

агтев ае реяса de arrasto- а emprega.r па provincia.. Лrt. ,de Angola е dividido еш

PUC-Rio - Certificação Digital Nº 0713629/CA.. fomenta a análise de possíveis cenários de otimização do custo e do prazo relacionados à atividade de transporte