Pilhas e Filas

52
Pilhas e Filas Pilhas e Filas Denise Guliato Faculdade de Computação – UFU www.facom.ufu.br/~guliato Vários slides foram adaptados de Nina Edelwais e Renata Galante Estrutura de Dados – Série de Livros Didáticos - Informática - UFRGS

description

Pilhas e Filas. Denise Guliato Faculdade de Computação – UFU www.facom.ufu.br/~guliato. Vários slides foram adaptados de Nina Edelwais e Renata Galante Estrutura de Dados – Série de Livros Didáticos - Informática - UFRGS. Pilhas e filas. Listas lineares especiais. - PowerPoint PPT Presentation

Transcript of Pilhas e Filas

Page 1: Pilhas  e  Filas

Pilhas e FilasPilhas e Filas

Denise GuliatoFaculdade de Computação – UFUwww.facom.ufu.br/~guliato

Vários slides foram adaptados de Nina Edelwais e Renata GalanteEstrutura de Dados – Série de Livros Didáticos - Informática - UFRGS

Page 2: Pilhas  e  Filas

Pilhas e filas

Disciplina restrita

• acesso permitido somente em alguns nodos

Com disciplina restrita de organização e acesso a seus nodos

Listas lineares especiaisListas lineares especiais

Page 3: Pilhas  e  Filas

Pilha

Listas lineares especiaisListas lineares especiaismais usuaismais usuais

Pilhas e filas

Fila

LIFO Last In First Out o último componente inserido é o primeiro a ser retirado

FIFO First In First Out o primeiro componente inserido é também o primeiro a ser retirado

Page 4: Pilhas  e  Filas

Consultas

Exclusões Inserções

Topo

Base

Pilhas e FilasPilhas e Filas

Início FinalInserções

Exclusõese

Consultas

PILHA

FILA

Page 5: Pilhas  e  Filas

PilhasPilhas

Page 6: Pilhas  e  Filas

ConsultasExclusões Inserções

Topo

Base

• Criar uma pilha vazia• Inserir um elemento no topo da pilha• Remover um elemento do topo de pilha• Consultar o topo da pilha• Destruir a pilha• Verificar se é cheia•Verificar se é vazia

Operações sobre PilhasOperações sobre PilhasPilhas

Page 7: Pilhas  e  Filas

TAD PilhaTAD Pilha

Dados: numeros inteiros

Operações:E_cheia entrada: o endereço da pilha processo: verifica se pilha esta na condição de

cheia saida: 1 se cheia, 0 caso contrário

Page 8: Pilhas  e  Filas

TAD PilhaTAD Pilha

E_vazia entrada: endereço da pilha processo: verifica se a pilha está na condição

de vazia saida: 1 se vazia, 0 caso contrario

Page 9: Pilhas  e  Filas

TAD PilhaTAD Pilha

Cria_pilha entrada: nenhuma processo: aloca a pilha e a coloca na condição

de vazia saida: endereço da pilha

Page 10: Pilhas  e  Filas

TAD PilhaTAD Pilha

Push entrada: endereço da lista e o elemento processo: insere elemento no topo da pilha e

atualiza pilha saida: 1 se sucesso , 0 se fracasso

Page 11: Pilhas  e  Filas

TAD PilhaTAD Pilha

Pop entrada: endereço da lista processo: remove elemento do topo da pilha e

atualiza pilha saida: endereço do elemento no topo da pilha

ou NULL se pilha é vazia

Page 12: Pilhas  e  Filas

TAD PilhaTAD Pilha

Top entrada: endereço da lista processo: consulta o topo da pilha saida: endereço do elemento no topo da pilha

ou NULL se pilha é vazia

Page 13: Pilhas  e  Filas

TAD PilhaTAD Pilha

Libera_pilha entrada: endereço da lista processo: libera toda area alocada para a pilha saida: nenhuma

Page 14: Pilhas  e  Filas

PilhasPilhas

Pilhas Pilhas implementadas por implementadas por contiguidade físicacontiguidade física

Page 15: Pilhas  e  Filas

Pilha - contigPilha - contiguuidade física idade física LIMITE

Topo

BasePilha

Índicesdo arranjo

Pilha – contiguidade física

• Implementada sobre um arranjo

• Índices de controle da pilha:• BASE da pilha• TOPO atual da pilha• LIMITE máximo que pode ser ocupado pela pilha

Page 16: Pilhas  e  Filas

Exemplo de manipulação de uma pilhaExemplo de manipulação de uma pilha

MAX-1

TOPO

BASE

PILHA

9

8

7

6

5

4

3

2

1

0 3

MAX-1

TOPOBASE 3

7

MAX-1

TOPOBASE 3

75

MAX-1

TOPO

BASE 37

MAX-1

TOPOBASE

Retorna “7”

1. Inicializar pilha de valores inteiros,a partir do índice 0, máximo 10 nós2. Inserir nodo com valor 33. Inserir nodo com valor 74. Inserir nodo com valor 55. Remover nodo do topo6. Consultar pilha

Pilha – contiguidade física

PILHA PILHA PILHA PILHA

9

8

7

6

5

4

3

2

1

0

9

8

7

6

5

4

3

2

1

0

9

8

7

6

5

4

3

2

1

0

9

8

7

6

5

4

3

2

1

0

Retorna “5”

Page 17: Pilhas  e  Filas

Pilha – contiguidade física

struct stack { int pilha[MAX]; int topo; };typedef struct stack *Pilha;

Tipo de dados utilizado nos algoritmos para pilha implementada por contiguidade física:

Page 18: Pilhas  e  Filas

MAX - 1

TopoBase

Pilha

1. Alocar área para a pilha2. Indicar que a pilha está vazia

Exemplo:

Base 0Topo – 1MAX 10

Criação da pilhaCriação da pilha

Pilha – contiguidade física

9

8

7

6

5

4

3

2

1

0

Page 19: Pilhas  e  Filas

Pilha Cria_pilha(void){ Pilha Ptp; Ptp = (Pilha) malloc(sizeof(struct stack)); if (Ptp != NULL) Ptp->topo = -1; return Ptp;}

Algoritmo:Algoritmo: criação de uma pilha criação de uma pilhaPilha Cria_pilha(void)Pilha Cria_pilha(void)

Pilha – contiguidade física

Page 20: Pilhas  e  Filas

Verifica se pilha é cheiaVerifica se pilha é cheia int E_cheia(Pilha Ptp) int E_cheia(Pilha Ptp)

int E_vazia(Pilha Ptp)int E_vazia(Pilha Ptp)

int E_cheia(Pilha Ptp){ if (Ptp->topo == MAX-1) return 1; else return 0;}

int E_vazia(Pilha Ptp){ if (Ptp->topo == -1) return 1; else return 0;}

Page 21: Pilhas  e  Filas

MAX -1

Topo

Base

Pilha

MAX - 1

Topo

Base

Pilha

9876543210

Operação PUSH

Inserção de um elemento na pilhaInserção de um elemento na pilhaPilha – contiguidade física

9

8

7

6

5

4

3

2

1

0

Page 22: Pilhas  e  Filas

Pilha – contiguidade físicaAlgoritmo: Algoritmo: inserer elemento no topo da pilhaint Push(Pilha *Ptp, int elem)

int Push(Pilha *Ptp, int elem){ if ((*Ptp)->topo == MAX-1) return 0; (*Ptp)->topo++; (*Ptp)->pilha[(*Ptp)->topo] = elem; return 1;}

Page 23: Pilhas  e  Filas

MAX - 1

Topo

Base

Pilha

MAX - 1

Topo

Base

Pilha

Operação POP

Pilha – contiguidade física

Remoção de um elemento da pilhaRemoção de um elemento da pilha

9

8

7

6

5

4

3

2

1

0

9

8

7

6

5

4

3

2

1

0

Page 24: Pilhas  e  Filas

int* Pop(Pilha *Ptp){ int* elem; if ((*Ptp)->topo == -1) return NULL; elem = (int*)malloc(sizeof(int)); *elem = (*Ptp)->pilha[(*Ptp)->topo]; (*Ptp)->topo--; return elem;}

Algoritmo:Algoritmo: Remover elemento do topo de Pilhaint* Pop(Pilha *Ptp)

Page 25: Pilhas  e  Filas

?

MAX - 1

Topo

Base

Pilha

9876543210

Pilha – contiguidade física

Consulta o topa da pilhaConsulta o topa da pilha

• Acesso somente ao elemento do topo da pilha

Page 26: Pilhas  e  Filas

int* Top(Pilha Ptp){ int* elem; if (Ptp->topo == -1) return NULL; elem = (int*)malloc(sizeof(int)); *elem = Ptp->pilha[Ptp->topo]; return elem;}

Algoritmo:Algoritmo: Consultar o elemento do topo de Pilha int* Top(Pilha Ptp)

int* Top(Pilha Ptp){ if (Ptp->topo == -1) return NULL; return &(Ptp->pilha[Ptp->topo]);}

Page 27: Pilhas  e  Filas

Destruição da pilhaDestruição da pilhavoid Libera_pilha(Pilha* Ptp)void Libera_pilha(Pilha* Ptp)

void Libera_pilha(Pilha *Ptp){ free(*Ptp); (*Ptp)=NULL;}

Page 28: Pilhas  e  Filas

typedef struct stack *Pilha;

int E_cheia(Pilha Ptp);int E_vazia(Pilha Ptp);Pilha Cria_pilha(void);int Push(Pilha *Ptp, int elem);int* Pop(Pilha *Ptp);int* Top(Pilha Ptp);void Libera_pilha(Pilha *Ptp);

paeas.hpaeas.h

Page 29: Pilhas  e  Filas

Exercício para entregar dia Exercício para entregar dia 17/06 17/06 Implemente o TAD utilizando uma estrutura de dados

com alocação estática e acesso sequencialImplemente uma função que, usando o TAD Pilha,

verifique se uma dada palavra representada como uma STRING (que não contenha brancos) é uma palíndromo (palavras que não se alteram quando lidas da direita para a esquerda ou da esquerda para a direita). ReExemplos: ANA, ADGHGDA. Retorne 1 se palavra é palindromo, e 0 caso contrario.

Faça um programa que leia uma string (conjunto de palavras separadas por brancos) e indique quais palavras da string são palindromos e quais não são.

Page 30: Pilhas  e  Filas

PilhasPilhas

Pilhas Pilhas implementadas por implementadas por encadeamentoencadeamento

Page 31: Pilhas  e  Filas

Base

Topo

inserções

remoções

?consultas

PtPilha

Info Elo

Topo da pilha

Base da pilha

Endereço do topo da pilha

Pilha implementada por encadeamentoPilha implementada por encadeamento

struct no{ int info; struct no* elo; };typedef struct no* Pilha;

Tipo de dados utilizado nos algoritmos:

Page 32: Pilhas  e  Filas

Pilha por encadeamento

Criação de pilha encadeadaCriação de pilha encadeada

• Pilha criada vazia

• Atribuir endereço nulo para apontador que contém o endereço do topo da pilha

Page 33: Pilhas  e  Filas

Algoritmo:Algoritmo: Criar Pilha EncadeadaPilha Cria_pilha(void)Pilha Cria_pilha(void)

Pilha por encadeamento

Pilha Cria_pilha(void){ return NULL;}

Page 34: Pilhas  e  Filas

Topo

Inserção Inserção de um nodo de um nodo em pilha encadeadaem pilha encadeada

Topo

Pilha por encadeamento

• Novo nodo inserido sempre no topo da pilha

PtPilha PtPilha

Topo

Novo nodo

Base Base

Page 35: Pilhas  e  Filas

int Push(Pilha *Ptp, int elem){ Pilha pt; pt= (Pilha)malloc(sizeof(struct no)); if (pt == NULL) return 0; pt->elo = (*Ptp); pt->info = elem; (*Ptp) = pt; return 1;}

Algoritmo:Algoritmo: Inserir nodo em Pilha Encadeadaint Push(Pilha *Ptp, int elem)

Pilha por encadeamento

Page 36: Pilhas  e  Filas

PtPilha

Topo

Desempilha um nodo de umaDesempilha um nodo de uma pilha encadeada pilha encadeada

Pilha por encadeamento

Topo

PtPilha

Base Base

• Só pode ser removido o nodo do topo da pilha

Nodo a ser removido

Page 37: Pilhas  e  Filas

Pilha por encadeamentoAlgoritmo:Algoritmo: Desempilha nodo de Pilha Encadeadaint* Pop(Pilha* Ptp)

int* Pop(Pilha* Ptp){ int* elem; Pilha aux = (*Ptp); if ((*Ptp) == NULL) return NULL; elem = (int*) malloc(sizeof(int)); *elem = (*Ptp)->info; (*Ptp)= (*Ptp)->elo; free(aux); return elem;}

Page 38: Pilhas  e  Filas

Consulta à pilha encadeada Consulta à pilha encadeada

Pilha por encadeamento

• Só pode ser acessado o nodo do topo da pilha

Topo

PtPilha

Base

Nodo que pode ser acessado

Page 39: Pilhas  e  Filas

Pilha por encadeamentoAlgoritmo:Algoritmo: Consultar nodo do topo de Pilha Encadeadaint* Top (Pilha Ptp)

int* Top(Pilha Ptp){ int* elem; if (Ptp == NULL) return NULL; elem = (int*) malloc(sizeof(int)); *elem = Ptp->info; return elem;}

Page 40: Pilhas  e  Filas

PtPilha = nilBase

Topo

Base

Topo

Base

Topo

Base

Topo

PtPilha

PtPilha

PtPilha

Destruição de uma pilha encadeada Destruição de uma pilha encadeada

Pilha por encadeamento

• Liberar espaço ocupado pelos nodos, sempre a partir do topo da pilha

• No final: apontador para o topo = endereço nulo

Page 41: Pilhas  e  Filas

Pilha por encadeamentoAlgoritmo:Algoritmo: Destruir Pilha Encadeadavoid Libera_pilha(Pilha*Ptp)

void Libera_pilha(Pilha* Ptp){ Pilha aux; while ((*Ptp) != NULL) { aux = (*Ptp); (*Ptp) = (*Ptp)->elo; free(aux); }}

Page 42: Pilhas  e  Filas

Verifica de pilha esta cheiaVerifica de pilha esta cheiaint E_cheia(Pilha Ptp)int E_cheia(Pilha Ptp)

Verifica de pilha esta vaziaVerifica de pilha esta vaziaint E_vazia(Pilha Ptp)int E_vazia(Pilha Ptp)

int E_cheia(Pilha Ptp){ return 0;}

int E_vazia(Pilha Ptp){ if (Ptp == NULL) return 1; else return 0;}

Page 43: Pilhas  e  Filas

Exercício

Implemente o TAD Pilha utilizando alocação dinâmica de memória e acesso encadeado.

Teste o programa para reconhecer quais palavras são palíndromos em uma dada frase.

Page 44: Pilhas  e  Filas

Aplicação da estrutura de dados Aplicação da estrutura de dados Pilha em avaliação de expressões Pilha em avaliação de expressões aritméticasaritméticasForma das expressõesConsidere: Operandos: [0,...,9] Operadores:[+,-,/,x,^] Delimitadores: [(,)]Exemplos:2 + 3 * 5 = 17(2 + 3) * 5 = 25

As operações são efetuadas de acordo com a ordem de precedência dos operadores;

Os parênteses alteram a ordem natural deavaliação dos operadores.

Page 45: Pilhas  e  Filas

Proponham um algoritmo para Proponham um algoritmo para avaliar expressões aritméticas avaliar expressões aritméticas

22 – 56 / 2;(22-56)/2;40/(2x(3-1) +6);2^3x4;2^(3x4);

?

Page 46: Pilhas  e  Filas

Notação PolonesaNotação Polonesa

Proposta pelo lógico polones Jan lukasiewiscz em ?

Permite escrever uma expressao aritmética em que a precedencia é implicita

Page 47: Pilhas  e  Filas

Notação PolonesaNotação Polonesa

expressão: ----------

2 + 5 x 3 2 + 3 – 42 + (3 – 4)(2 + 4)/(3 -1)(2+4)/(3-1)x42^2*3-4+1/2/(1+1)

forma pós-fixada

2 5 3 x + 2 3 + 4 - 2 3 4 - +2 4 + 3 1 - /2 4 + 3 1 – / 4 x2 2 ^ 3 * 4 – 1 2 / 1 1 + / +

forma pré-fixada

+ 2 x 5 3 - + 2 3 4+ 2 – 3 4/ + 2 4 -3 1x / +2 4-3 1 4 + -*^2 2 3 4 / / 1 2 + 1 1

Page 48: Pilhas  e  Filas

Forma pós-fixada para avaliar expressoes aritmeticas Forma pós-fixada para avaliar expressoes aritmeticas usando pilha float avalia_expressao(char *pos-fixada)usando pilha float avalia_expressao(char *pos-fixada)

float avalia_expressao(char *pos-fixada)Inicio Ptp aponta para uma pilha vazia Enquanto (nao processou toda expressao pos-fixada) Inicio simbolo = token; se (simbolo é um operando) empilha simbolo na pilha Ptp senao inicio operando2 = desempilha elemento da pilha Ptp operando1 = desempilha elemento da pilha Ptp valor = operando1 simbolo operando2 empilha valor na pilha Ptp fim se Fim enquantoRetorna (desempilha o elemento da pilha Ptp)Fim da funçao

Page 49: Pilhas  e  Filas

Como transformar uma expressão na forma infixa Como transformar uma expressão na forma infixa para pos-fixa???para pos-fixa???

- Expressões entre parênteses devem ser convertidos de tal forma que possam ser tratadas como um único operando.

- Somente operadores são empilhados . Um operador é empilhado apenas se possui precedência maior que o operador no topo da pilha.

- Abre parênteses é sempre empilhado- Fecha parênteses nunca é empilhado (menor

precedência).Todos os operadores são desempilhados até encontrar um ‘(‘.

- Operandos e operadores desempilhados são colocados na expressão na forma pós-fixa

Page 50: Pilhas  e  Filas

Algoritmo: char* pos-fixa(char* in-fixa)Inicio inicializa pilha de operadores e aloca area do tamanho da expressao in-fixa enquanto (não processou toda a expressao in-fixa) inicio simbolo = token se (simbolo é operando) coloca simbolo na expressao pos-fixa senao inicio enquanto (pilha não eh vazia E precedencia(topo da pilha, simbolo) inicio topo = desempilha coloca topo na expressao pos-fixa fim enquanto se (pilha eh vazia OU simbolo # ‘)’ ) empilha simbolo senao enquanto ( (topo = desempilha) != ‘(‘) coloca topo na expressao pos-fixa; fim se fim se fim enquanto enquanto ( pilha não eh vazia) desempilha topo e coloca na expressao pos-fixa fim enquanto Fim da função

Precedencia(‘(‘, op) --- falsePrecedencia (op,’(‘) ---- false, exceto op=‘)’Precedencia (op,’)’) -----false, exceto op=‘(‘Precedencia (‘)’, op) --- indefinido

símbolotopo de pilha

Page 51: Pilhas  e  Filas

Exercício usando pilha (entregar Exercício usando pilha (entregar dia 30/06 )dia 30/06 )Escreva uma função que transforma uma

expressão da forma in-fixa para a forma pós-fixa.

Escreva uma função que avalie uma expressão na forma pós-fixa

Escreva um programa que entra com a expressão aritmética pela linha de comando e avalia a expressão.

Page 52: Pilhas  e  Filas

Exercício usando pilha – cont.Exercício usando pilha – cont.

Os operandos são números reais (positivos e negativos);

Os operadores são: {+,-,x,/,^}Os delimitadores são: {(,)}

Ex: 3.4 x 5 + ( 2.1 – 12 ) (-23 + 24.3 / 2.1) ^ 3