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

Transcript of REVISÃO DE PILHAS E FILASvanessa/material/ed/02-Revisao-Pilhas-Filas.pdf · EXEMPLO DE...

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