Estruturas de Dados. Módulo 11 Pilhas. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Documentos relacionados
INF1007 Programação 2 9 Pilhas. (c) Dept. Informática - PUC-Rio 1

INF 1007 Programação II

Introdução a Programação. Tipos Abstratos de Dados Implementando Pilha e Fila

Estruturas de Dados. Módulo 12 - Filas. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Instituto de C. Filas. Luis Martí Instituto de Computação Universidade Federal Fluminense -

INF1007: Programação 2 8 Listas Encadeadas. (c) Dept. Informática - PUC-Rio 1

Módulo 10 Listas Encadeadas

Departamento de Informática - PUC-Rio INF 1007 Programação 2 P3 23/06/2010

12. Filas Interface do tipo fila

Instituto de C. Linguagem C: Listas. Luis Martí Instituto de Computação Universidade Federal Fluminense -

INF P4-12/12/09 Questão 1 Nome:

Programação II. Pilhas (stacks) Bruno Feijó Dept. de Informática, PUC-Rio

Métodos Computacionais. Fila

SCC 202 Algoritmos e Estruturas de Dados I. Pilhas (Stacks) (implementação dinâmica)

Departamento de Informática - PUC-Rio INF 1007 Programação 2 P3 26/11/2010

Programação II. Filas (Queues) Bruno Feijó Dept. de Informática, PUC-Rio

INF 1620 P2-01/11/03 Questão 1 Nome:

Estrutura de Dados II. Prof. Sérgio Portari

Estruturas de Dados Filas

Prof. Jesus José de Oliveira Neto

Estruturas de Dados Aula 11: TAD Pilha

Pilhas e Filas. Nádia Félix e Hebert Coelho

PRIMEIRA AVALIAÇÃO IDENTIFICAÇÃO. Nome: 22/09/2010

Universidade Estadual Paulista Júlio de Mesquita Filho UNESP

Métodos Computacionais. Listas Encadeadas

void push(int i){ if (num<max) vet[num++]=i; else { printf(">>> Erro: overflow na pilha!!!\n"); printf("%d nao foi empilhado!!!

- Estruturas e aplicações

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Pilha. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof. Gustavo Batista

Programação II. Listas Encadeadas (Linked Lists) Bruno Feijó Dept. de Informática, PUC-Rio

Pilhas. Fabrício J. Barth. BandTec - Faculdade de Tecnologia Bandeirantes

Pilha. SCC-202 Algoritmos e Estruturas de Dados I. Lucas Antiqueira

INF 1620 P2-23/10/04 Questão 1 Nome:

Estrutura de Dados. Carlos Eduardo Batista. Centro de Informática - UFPB

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

Algoritmos e Estruturas de Dados I

Estruturas de Dados Aula 16: Árvores com Número Variável 13/06/2011

Algoritmos e Estruturas de Dados II IEC013

INF1007: Programação 2. 4 Tipos Estruturados. 10/23/09 (c) Dept. Informática - PUC-Rio 1

Estruturas de Dados. Módulo 17 - Busca. 2/6/2005 (c) Dept. Informática - PUC-Rio 1

INF1007: Programação 2 9 Tipos Abstratos de Dados. (c) Dept. Informática - PUC-Rio 1

SCC Algoritmos e Estruturas de Dados I

Programação de Computadores II. Cap. 17 Busca

Estruturas de Dados. Módulo 4 Funções. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Módulo 18 - Tabelas de Dispersão. Referências

Módulo 8 Tipos Estruturados

UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 5 Pilhas

REVISÃO DE C. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Introdução a Programação. Listas Encadeadas

Módulo 3 Controle de Fluxo

Pilha. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof. Gustavo Batista

Estruturas de Dados Aula 12: Outras Implementações de Listas 18/04/2011

Pilhas. Prof. Rui Jorge Tramontin Jr. UDESC - Rui J. Tramontin Jr. 1

Módulo 5 Vetores e Alocação Dinâmica

Fontes Bibliográficas. Listas Circulares. Função Imprime

INF1007: Programação 2. 0 Revisão. 06/08/2015 (c) Dept. de Informática - PUC-Rio 1

SCC Algoritmos e Estruturas de Dados I

Estruturas Compostas Parte II

INF 1007 Programação II

Conceitos. Pilhas e Filas. Conceitos e Implementação em linguagem C. Maria Adriana Vidigal de Lima. Março

INF 1007 Programação II

//Declaração do TAD pilha. // As operações definidas para esse tipo são criar() push() pop() destroi() // typedef struct pilha TPilha;

Cap. 3 Entrada e Saída e Controle de Fluxo

Pilhas e Filas Encadeadas. Algoritmos e Estruturas de Dados I

Atividade de laboratório listas encadeadas simples

Alocação de Memória. Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR)

INF1007: Programação 2 10 Árvores Binárias. (c) Dept. Informática - PUC-Rio 1

INF 1007 Programação II

As duas soluções a seguir são exemplos da variedade de soluções admissíveis.

Programação de Computadores II. Cap. 9 Tipos Abstratos de Dados (TAD)

Programação de Computadores II. Cap. 5 Vetores

Fontes Bibliográficas. Estruturas de Dados Aula 15: Árvores. Livros:

INF1007: Programação 2 7 Busca em Vetores. 01/04/2014 (c) Dept. Informática - PUC-Rio 1

Algoritmos e Estruturas de Dados 2007/2008

Fabrício J. Barth. BandTec - Faculdade de Tecnologia Bandeirantes

PRIMEIRA AVALIAÇÃO IDENTIFICAÇÃO. Nome: 04/05/2011

Árvores. Prof. César Melo DCC/ICE/UFAM

Listas Encadeadas. Fabrício J. Barth. BandTec - Faculdade de Tecnologia Bandeirantes

Módulo 7 Cadeias de Caracteres

Árvores. Prof. César Melo DCC/ICE/UFAM

INF 1620 P3-02/07/02 Questão 1 Nome:

Lista: conceito, representação e algoritmos

Alocação Seqüencial VAL MAX TOPO

Introdução à Programação

A regra de acesso aos dados de uma fila é a seguinte: O primeiro elemento que entra (na fila) é o primeiro que sai (FIFO first in, first out).

INF1007: Programação 2. 2 Alocação Dinâmica. 17/02/2014 (c) Dept. Informática - PUC-Rio 1

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco

Princípios de Desenvolvimento de Algoritmos MAC122 Prof. Dr. Paulo Miranda IME-USP

Melhores momentos AULA 14

ÁRVORES ABB (ÁRVORES BINÁRIAS DE BUSCAS) Sérgio Carlos Portari Júnior

Métodos Computacionais. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

Estruturas de Dados Aula 11: TAD Pilha 09/05/2011

Métodos Computacionais. Variações de Listas Encadeadas

2. Considerando as seguintes declarações de uma lista encadeada

Transcrição:

Estruturas de Dados Módulo 11 Pilhas 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Referências Waldemar Celes, Renato Cerqueira, José Lucas Rangel, Introdução a Estruturas de Dados, Editora Campus (2004) Capítulo 11 Pilhas 9/8/2005 (c) Dept. Informática - PUC-Rio 2

Tópicos Introdução Interface do tipo pilha Implementação de pilha com vetor Implementação de pilha com lista Exemplo de uso: calculadora pós-fixada 9/8/2005 (c) Dept. Informática - PUC-Rio 3

Introdução Pilha novo elemento é inserido no topo e acesso é apenas ao topo o primeiro que sai é o último que entrou (LIFO last in, first out ) operações básicas: empilhar (push) um novo elemento, inserindo-o no topo desempilhar (pop) um elemento, removendo-o do topo push (a) push (b) push (c) pop () retorna c push (d) pop () retorna d a topo b a topo c b a topo b a topo d b a topo b a topo 9/8/2005 (c) Dept. Informática - PUC-Rio 4

Interface do tipo pilha Implementações: usando um vetor usando uma lista encadeada simplificação: pilha armazena valores reais 9/8/2005 (c) Dept. Informática - PUC-Rio 5

Interface do tipo pilha Interface do tipo abstrato Pilha: pilha.h função pilha_cria aloca dinamicamente a estrutura da pilha inicializa seus campos e retorna seu ponteiro funções pilha_push e pilha_pop inserem e retiram, respectivamente, um valor real na pilha função pilha_vazia informa se a pilha está ou não vazia função pilha_libera destrói a pilha, liberando toda a memória usada pela estrutura. 9/8/2005 (c) Dept. Informática - PUC-Rio 6

typedef struct pilha Pilha; Pilha* pilha_cria (void); tipo Pilha: definido na interface depende da implementação do struct pilha void pilha_push (Pilha* p, float v); float pilha_pop (Pilha* p); int pilha_vazia (Pilha* p); void pilha_libera (Pilha* p); 9/8/2005 (c) Dept. Informática - PUC-Rio 7

Implementação de pilha com vetor Implementação de pilha com vetor vetor (vet) armazena os elementos da pilha elementos inseridos ocupam as primeiras posições do vetor elemento vet[n-1] representa o elemento do topo #define N 50 /* número máximo de elementos */ struct pilha { int n; /* vet[n]: primeira posição livre do vetor */ float vet[n]; /* vet[n-1]: topo da pilha */ /* vet[0] a vet[n-1]: posições ocupáveis */ }; 9/8/2005 (c) Dept. Informática - PUC-Rio 8

Implementação de pilha com vetor função pilha_cria aloca dinamicamente um vetor inicializa a pilha como sendo vazia, isto é, com o número de elementos igual a zero tipo Pilha: definido na interface Pilha* pilha_cria (void) struct pilha: determina a implementação { Pilha* p = (Pilha*) malloc(sizeof(pilha)); p->n = 0; /* inicializa com zero elementos */ return p; } 9/8/2005 (c) Dept. Informática - PUC-Rio 9

Implementação de pilha com vetor função pilha_push insere um elemento na pilha usa a próxima posição livre do vetor, se houver void pilha_push (Pilha* p, float v) { if (p->n == N) { /* capacidade esgotada */ printf("capacidade da pilha estourou.\n"); exit(1); /* aborta programa */ } /* insere elemento na próxima posição livre */ p->vet[p->n] = v; p->n++; /* equivalente a: p->n = p->n + 1 */ } 9/8/2005 (c) Dept. Informática - PUC-Rio 10

Implementação de pilha com vetor função pilha_pop retira o elemento do topo da pilha, retornando o seu valor verificar se a pilha está ou não vazia float pilha_pop (Pilha* p) { float v; if (pilha_vazia(p)) { printf("pilha vazia.\n"); exit(1); } /* aborta programa */ /* retira elemento do topo */ v = p->vet[p->n-1]; p->n--; return v; } 9/8/2005 (c) Dept. Informática - PUC-Rio 11

Implementação de pilha com lista Implementação de pilha com lista elementos da pilha armazenados na lista pilha representada por um ponteiro para o primeiro nó da lista /* nó da lista para armazenar valores reais */ struct lista { float info; struct lista* prox; }; typedef struct lista Lista; /* estrutura da pilha */ struct pilha { Lista* prim; /* aponta para o topo da pilha */ }; 9/8/2005 (c) Dept. Informática - PUC-Rio 12

Implementação de pilha com lista função pilha_cria cria aloca a estrutura da pilha inicializa a lista como sendo vazia Pilha* pilha_cria (void) { Pilha* p = (Pilha*) malloc(sizeof(pilha)); p->prim = NULL; return p; } 9/8/2005 (c) Dept. Informática - PUC-Rio 13

Implementação de pilha com lista função pilha_push insere novo elemento n no início da lista void pilha_push (Pilha* p, float v) { Lista* n = (Lista*) malloc(sizeof(lista)); n->info = v; n->prox = p->prim; p->prim = n; } 9/8/2005 (c) Dept. Informática - PUC-Rio 14

Implementação de pilha com lista função pilha_pop retira o elemento do início da lista float pilha_pop (Pilha* p) { Lista* t; float v; if (pilha_vazia(p)) { printf("pilha vazia.\n"); exit(1); } /* aborta programa */ t = p->prim; v = t->info; p->prim = t->prox; free(t); return v; } 9/8/2005 (c) Dept. Informática - PUC-Rio 15

Implementação de pilha com lista função pilha_libera libera a pilha depois de liberar todos os elementos da lista void pilha_libera (Pilha* p) { Lista* q = p->prim; while (q!=null) { Lista* t = q->prox; free(q); q = t; } free(p); } 9/8/2005 (c) Dept. Informática - PUC-Rio 16

Exemplo de uso: calculadora pós-fixada Notação para expressões aritméticas infixa = operador entre os operandos (1-2)*(4+5) pós-fixa = operador após operandos 1 2 4 5 + * pré-fixa = operador antes dos operandos * - 1 2 + 4 5 Exemplo: calculadora HP científica usa notação pós-fixa 9/8/2005 (c) Dept. Informática - PUC-Rio 17

Exemplo de uso: calculadora pós-fixada Avaliação de expressões aritméticas pós-fixadas: cada operando é empilhado numa pilha de valores quando se encontra um operador desempilha-se o número apropriado de operandos (dois para operadores binários e um para operadores unários) realiza-se a operação devida empilha-se o resultado Exemplo: avaliação da expressão 1 2 4 5 + * 9/8/2005 (c) Dept. Informática - PUC-Rio 18

empilhe os valores 1 e 2 quando aparece o operador desempilhe 1 e 2 empilhe -1, o resultado da operação (1-2) empilhe os valores 4 e 5 quando aparece o operador + desempilhe 4 e 5 empilhe 9, o resultado da operação (4+5) quando aparece o operador * desempilhe -1 e 9 empilhe -9, o resultado da operação (-1*9) 1 2 4 5 + * 1 2 4 5 + * 1 2 4 5 + * 1 2 4 5 + * 1 2 4 5 + * 2 1-1 5 4-1 -1 9-1 -9 9/8/2005 (c) Dept. Informática - PUC-Rio 19

Exemplo de uso: calculadora pós-fixada Interface da calculadora calc.h typedef struct calc Calc; /* funções exportadas */ Calc* calc_cria (char* f); void calc_operando (Calc* c, float v); void calc_operador (Calc* c, char op); void calc_libera (Calc* c); /* tipo representando a calculadora */ struct calc { char f[21]; /* formato para impressão (cadeia de caracteres) */ Pilha* p; /* pilha de operandos */ }; 9/8/2005 (c) Dept. Informática - PUC-Rio 20

Exemplo de uso: calculadora pós-fixada função cria recebe como entrada uma cadeia de caracteres com o formato que será utilizado pela calculadora para imprimir os valores cria uma calculadora inicialmente sem operandos na pilha Calc* calc_cria (char* formato) { Calc* c = (Calc*) malloc(sizeof(calc)); strcpy(c->f,formato); /* copia a cadeia de caracteres formato para a cadeia de caracteres c->f */ c->p = pilha_cria(); /* cria pilha vazia */ return c; } 9/8/2005 (c) Dept. Informática - PUC-Rio 21

Exemplo de uso: calculadora pós-fixada função operando coloca no topo da pilha o valor passado como parâmetro void calc_operando (Calc* c, float v) { /* empilha operando */ pilha_push(c->p,v); /* imprime topo da pilha */ printf(c->f,v); } 9/8/2005 (c) Dept. Informática - PUC-Rio 22

Exemplo de uso: calculadora pós-fixada função operador retira dois valores do topo da pilha (operadores são binários) efetua a operação correspondente coloca o resultado no topo da pilha operações válidas: '+', '-', '*' e '/' se não existirem operandos na pilha, assume-se que são zero 9/8/2005 (c) Dept. Informática - PUC-Rio 23

void calc_operador (Calc* c, char op) { float v1, v2, v; if (pilha_vazia(c->p)) /* desempilha operandos */ v2 = 0.0; else v2 = pilha_pop(c->p); if (pilha_vazia(c->p)) v1 = 0.0; else v1 = pilha_pop(c->p); switch (op) { /* faz operação */ case '+': v = v1+v2; break; case '-': v = v1-v2; break; case '*': v = v1*v2; break; case '/': v = v1/v2; break; } pilha_push(c->p,v); /* empilha resultado */ printf(c->f,v); /* imprime topo da pilha */ } 9/8/2005 (c) Dept. Informática - PUC-Rio 24

Exemplo de uso: calculadora pós-fixada /* Programa para ler expressão e chamar funções da calculadora */ #include <stdio.h> #include "calc.h" int main (void) { char c; float v; Calc* calc; /* cria calculadora com formato de duas casas decimais */ calc = calc_cria ("%.2f\n"); (ver livro) 9/8/2005 (c) Dept. Informática - PUC-Rio 25

Resumo Pilha top push pop retorna o topo da pilha insere novo elemento no topo da pilha remove o elemento do topo da pilha push (a) push (b) push (c) pop () retorna c push (d) pop () retorna d a topo b a topo c b a topo b a topo d b a topo b a topo 9/8/2005 (c) Dept. Informática - PUC-Rio 26