estrutura de dados - pilha

18
Algoritmos e Estruturas de Dados Ezequiel R. Zorzal [email protected] www.realidadeaumenta da.com.br Aula: Pilhas (Stack)

Upload: lucas-masiero

Post on 16-Nov-2015

43 views

Category:

Documents


2 download

DESCRIPTION

funcoes e structs de TAD pilha

TRANSCRIPT

  • Algoritmos e Estruturas de Dados

    Ezequiel R. [email protected]

    www.realidadeaumentada.com.br

    Aula: Pilhas (Stack)

    http://www.pdfcomplete.com/cms/hppl/tabid/108/Default.aspx?r=q8b3uige22

  • Objetivo Definir conceitos bsicos sobre pilhas

    Implementar pilhas utilizando vetores

    Praticar exerccios para consolidar a teoria apresentada

    2

    http://www.pdfcomplete.com/cms/hppl/tabid/108/Default.aspx?r=q8b3uige22

  • Definio de Pilha

    Inseres e Remoes seguem o esquema Last In First Out (LIFO)

    Analogia a uma pilha de pratos ou de livros

    Uma coleo ordenada de elementos na qual elementos so inseridos e retirados em apenas uma das extremidades denominada "topo".

    TOPO

    http://www.pdfcomplete.com/cms/hppl/tabid/108/Default.aspx?r=q8b3uige22

  • Exemplo: Entregador de Pizzas

    Organizao

    http://www.pdfcomplete.com/cms/hppl/tabid/108/Default.aspx?r=q8b3uige22

  • Aplicaes de Pilha Verificar se um cdigo fonte est bem estruturado; Recursividade; Controle da sequncia de chamadas de funes; Sintaxe de expresses aritmticas; Controle de Desfazer/Refazer aes em um editor

    de textos; Etc.

    http://www.pdfcomplete.com/cms/hppl/tabid/108/Default.aspx?r=q8b3uige22

  • Operaes Bsicas sobre Pilhas

    Criar a Pilha

    Empilhar elemento (Push)

    Desempilhar elemento (Pop)

    Consultar elemento no topo da pilha (Peek)

    Listar os elementos

    Liberar a Pilha

    http://www.pdfcomplete.com/cms/hppl/tabid/108/Default.aspx?r=q8b3uige22

  • Dada um pilha P=( a(1), a(2), ..., a(n) ), dizemos quea(1) o elemento da base da pilha; a(n) oelemento topo da pilha; e a(i+1) est acima de a(i).

    Criando uma pilha

    #define MAX_PILHA 5 //Nmero mximo de elementos

    typedef struct {

    int vet[MAX_PILHA];

    int pos;

    }Pilha;

    /* vet[pos]: primeira posio livre do vetor *//* vet[pos-1]: topo da pilha *//* vet[0] a vet[MAX_PILHA-1]: posies ocupveis */

    http://www.pdfcomplete.com/cms/hppl/tabid/108/Default.aspx?r=q8b3uige22

  • Pilha.h#define MAX_PILHA 5 //Nmero mximo de elementostypedef struct {

    int pos;int vet[MAX_PILHA];

    }Pilha;

    Pilha *pilha_create(); /* Aloca dinamicamente a estrutura da pilha, inicializa seus campos e retorna seu ponteiro */int pilha_push(Pilha* p, int val); // Insere elementos na Pilhaint pilha_pop(Pilha* p); // Retira elementos da Pilhaint pilha_peek(Pilha *p); // Retorna o elemento topovoid pilha_list(Pilha* p); // Imprime todos os elementosvoid pilha_free(Pilha* p); // Destri a Pilha e libera a memria

    http://www.pdfcomplete.com/cms/hppl/tabid/108/Default.aspx?r=q8b3uige22

  • Criando uma pilha

    Primeiro inicializamos uma pilha como vazia fazendo o campo pos = 0:

    Pilha* pilha_create(){Pilha* p = (Pilha*) malloc (sizeof (Pilha));p->pos = 0;return p;

    }

    http://www.pdfcomplete.com/cms/hppl/tabid/108/Default.aspx?r=q8b3uige22

  • Empilhando (push)

    int pilha_push (Pilha* p, int val){if (p->pos >= MAX_PILHA) // pilha cheia

    exit(1); // aborta programap->vet[p->pos] = val;(p->pos)++;return 0;

    }

    Para empilhar necessrio considerar a possibilidade de estouro de pilha, uma vez que es tamos trabalhando com vetor de tamanho fixo:

    http://www.pdfcomplete.com/cms/hppl/tabid/108/Default.aspx?r=q8b3uige22

  • Desempilhando (pop)

    int pilha_pop (Pilha* p){Int val;if (p->pos == 0) // pilha vazia

    exit(1); // aborta programaval = p->vet[p->pos-1];p->pos--;return val;

    }

    Para desempilhar necessrio considerar a possibilidade de underflow.

    http://www.pdfcomplete.com/cms/hppl/tabid/108/Default.aspx?r=q8b3uige22

  • Consultar elemento topo (peek)

    Int pilha_peek(Pilha* p){if (p->pos == 0) // pilha vazia

    exit(1); // aborta programareturn (p->vet[p->pos-1]);

    }

    Funo para consultar o elemento no topo da pilha.

    http://www.pdfcomplete.com/cms/hppl/tabid/108/Default.aspx?r=q8b3uige22

  • Listar elementos

    void pilha_list(Pilha* p){if (p==NULL) // pilha nao inicializada

    exit(1); // aborta programafor(int i=p->pos-1; i>=0; i--)

    printf("%d\n",p->vet[i]); }

    Funo para listar todos os elementos da pilha.

    http://www.pdfcomplete.com/cms/hppl/tabid/108/Default.aspx?r=q8b3uige22

  • Liberando espaos alocados

    void pilha_free(Pilha* p){free (p);

    }

    Funo para liberar os espaos alocados pela pilha.

    http://www.pdfcomplete.com/cms/hppl/tabid/108/Default.aspx?r=q8b3uige22

  • Programa teste

    #include#include"Pilha.h "main(){

    Pilha * p = pilha_create();pilha_push(p,10);pilha_push(p,4);pilha_push(p,5); int k = pilha_peek(p); printf("\n\n%d",k);int i = pilha_pop(p);pilha_list(p);pilha_free(p);

    }

    main.c

    http://www.pdfcomplete.com/cms/hppl/tabid/108/Default.aspx?r=q8b3uige22

  • Exerccios (Questo 1)

    16

    Escreva um programa que verifique se as expresses aritmticas esto com a parentizao correta. Seu programa deve checar expresses para ver se cada "abre parnteses" tem um "fecha parnteses" correspondente.

    Exemplo: ((5+3)-(4*2)) = CORRETO ((4/(2-9)) = INCORRETO

    http://www.pdfcomplete.com/cms/hppl/tabid/108/Default.aspx?r=q8b3uige22

  • Exerccios (Questo 2)

    17

    Implemente uma aplicao que utilize uma pilha para avaliar o aninhamento de expresses delimitadas por { }, ( ) e [ ] est correto. Exemplos: a = b + (c d ) * (e f); s = t[5] + u / (v * (w + y));

    http://www.pdfcomplete.com/cms/hppl/tabid/108/Default.aspx?r=q8b3uige22

  • Exerccios (Questo 3)

    18

    http://www.pdfcomplete.com/cms/hppl/tabid/108/Default.aspx?r=q8b3uige22