Algoritmos e Estruturas de Dados Ezequiel R. Zorzal [email protected] www.realidadeaumenta da.com.br Aula: Pilhas (Stack)
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