revisÃo de pilhas e filasvanessa/material/ed/02-revisao-pilhas-filas.pdf · exemplo de...

40
REVISÃO DE PILHAS E FILAS Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Upload: others

Post on 19-Jul-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

REVISÃO DE PILHAS E FILAS Vanessa BraganholoEstruturas de Dados e Seus Algoritmos

Page 2: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 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

Page 3: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

PILHAS

Page 4: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

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

Page 5: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

EXEMPLO DE APLICAÇÃO: RECURSÃO

void recursiveFunction(int num){

if (num < 5){

recursiveFunction(num + 1);printf("%d\n", num);

}}

int main() {recursiveFunction(0);

}

Page 6: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

RECURSÃO

void recursiveFunction(int num){

if (num < 5){

recursiveFunction(num + 1);printf("%d\n", num);

}}

int main() {recursiveFunction(0);

}

Page 7: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

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

Page 8: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

ALTERNATIVAS DE IMPLEMENTAÇÃO

Vetores

Listas Encadeadas

INSTITUTO DE COMPUTAÇÃO - UFF 8

Page 9: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

IMPLEMENTAÇÃO DE PILHAS COM VETORES

INSTITUTO DE COMPUTAÇÃO - UFF 9

Page 10: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

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

Page 11: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

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

Page 12: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

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

Page 13: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

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

Page 14: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

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

Page 15: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

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

Page 16: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

DECLARAÇÃO EM C

typedef struct pilha {int info;

} TPilha;

int base, lim, topo;

INSTITUTO DE COMPUTAÇÃO - UFF 16

Page 17: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

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

Page 18: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

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.

Page 19: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

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

Page 20: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

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.

Page 21: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

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

Page 22: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

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

Page 23: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

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

Page 24: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

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

Page 25: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

IMPLEMENTAÇÃO COMPLETA

A implementação completa está no site da disciplina

INSTITUTO DE COMPUTAÇÃO - UFF 25

Page 26: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

IMPLEMENTAÇÃO DE PILHAS COM LISTAS ENCADEADAS

INSTITUTO DE COMPUTAÇÃO - UFF 26

Page 27: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

PILHA COM LISTA ENCADEADA

8

4

2

7

1

5topoinfo prox

#include "lista-encadeada.h"

typedef struct pilha{TLista *topo;

} TPilha;

λ

pilha

Page 28: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

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

Page 29: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

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

Page 30: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

CHAMADA DO PUSH NA FUNÇÃO MAIN

int main() {TPilha *pilha = inicializa();push(pilha, 5);...

}

INSTITUTO DE COMPUTAÇÃO - UFF 30

5topoinfo prox

λ

pilha

Page 31: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

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

Page 32: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

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

Page 33: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

FILAS

Page 34: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

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

Page 35: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

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

Page 36: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

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

Page 37: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

FILA VAZIA

int fila_vazia(TFila *f){if (f->inicio == NULL) {

return 1;}else return 0;

}

INSTITUTO DE COMPUTAÇÃO - UFF 37

Page 38: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

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

Page 39: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

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

Page 40: REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE MANIPULAÇÃO DE PILHA COM VETOR 1. Inicializar pilha de inteiros com máximo de 10 nós 2

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