1 tipos abstratos de dados pilhas e filas tpa – 2008 –1 prof. mateus costa
Post on 18-Apr-2015
110 Views
Preview:
TRANSCRIPT
1
Tipos Abstratos de Dados
Pilhas e FilasTPA – 2008 –1
Prof. Mateus Costa
2
Pilhas
Comportamento: O último que chega é o primeiro que sai.
O comportamento da pilha pode ser especificado por 3 operações:
Empilha (push): Insere um elemento na pilhaDesempilha (pop) : remove o último
elemento que foi inserido na pilhaPilhaVazia: operação lógica: retorna
verdadeiro se não há nenhum elemento na pilha e falso caso contrário.
3
Pilhas
A restrição fundamental: o elemento a ser removido é sempre o último que foi inserido Obedecendo esta regra, não importa a
estrutura de armazenamento utilizada.
4
Pilhas –Implementação com Arranjos estáticos
– Considerando a implementação utilização de arranjos estáticos para a implementação de uma pilha temos que:• Deve-se definir o tipo de dado a ser armazenado na
pilha.– Exemplo: Inteiro, String, Caractere, real, Tipos definidos
pelo usuário.
• As posições do arranjo serão utilizados para o armazenamento dos dados
• Deve-se ter uma variável para indicar o topo da pilha:
– A variável deve ser do mesmo tipo do índice do arranjo Normalmente o tipo é inteiro.
• Para manter todas as informações da pilha definidas em uma única estrutura devemos definir um tipo Pilha contendo o arranjo e a variável topo.
5
Pilhas –Implementação com Arranjos estáticos
0
1
2
3
4
5
topo
Pilha com um arranjo.Tamanho máximo da pilha: 6
6
Pilhas –Implementação com Arranjos estáticos
• Definição do tipo para uma Pilha de inteiros#define MAX 6 // tamanho máximo da Pilha#define TRUE 1#define FALSE 0typedef int Elemento; // tipo a ser armazenadotypedef struct { int topo; Elemento itens[MAX]; } Pilha;
7
Pilhas –Implementação com Arranjos estáticos
Interface do TAD Pilha:int pilhaCheia(Pilha);int pilhaVazia(Pilha);void inicializaPilha(Pilha *);void empilha (Pilha *, Elemento);Elemento desempilha (Pilha *, Elemento);Elemento mostraTopo(Pilha);
8
Pilhas –Implementação com Arranjos estáticos
Implementação das operações:void inicializaPilha(Pilha *p) { p->topo=0; }
int pilhaCheia(Pilha){ if (Pilha.topo==MAX) { return TRUE; } else { return FALSE; }
9
Pilhas –Implementação com Arranjos estáticos
int pilhaVazia(Pilha p) { if(p.topo==0) { return TRUE; } else { return FALSE; }}
10
Pilhas –Implementação com Arranjos estáticos
void empilha (Pilha *p, Elemento ele){ if (pilhaCheia(*p)==FALSE) { p->itens[p->topo] = ele; p->topo++; } else{ fprintf(stderr, “Pilha Cheia”); } }
11
Pilhas –Implementação com Arranjos estáticos
Elemento desempilha(Pilha *p) { Elemento ele = 0; if (pilhaVazia(*p)==FALSE) { p->topo--; ele = p->itens[p->topo];} else{ fprintf(stderr, MSG_PILHAVAZIA); } return ele; }
12Exemplo: Pilha das Calculadoras HPTamanho 4Tipo Básico: Real
#define MAXPILHA 4#define true 1#define false 0#define MAIORIGUAL(X,Y)((X>=Y)?(true): (false)) typedef float elemento;typedef struct { int topo; elemento itens[MAXPILHA]; }Pilha;
13
Exemplo: Pilha das Calculadoras HPOperações
int pilhaCheia(Pilha p);int pilhaVazia(Pilha p);void inicializaPilha(Pilha *p);void empilha (Pilha *p, elemento ele);Elemento desempilha(Pilha *p);void mostraTopo(Pilha p);
14Exemplo: Pilha das Calculadoras HP:Inicializa Pilha (topo = -1) - Pilha Cheia – Pilha Vaziavoid inicializaPilha(Pilha *p) { p->topo=-1; } int pilhaCheia(Pilha p) { return MAIORIGUAL(p.topo,MAXPILHA-1);} int pilhaVazia(Pilha p) { return ((p.topo == -1) ? true : false ); }
15
Exemplo: Pilha das Calculadoras HPempilha – insere um elemento na pilha
void empilha (Pilha *p, elemento ele){ if (!pilhaCheia(*p)) { p->topo++; p->itens[p->topo] = ele;
} else{ fprintf(stderr, MSG_PILHACHEIA); } }
16Exemplo: Pilha das Calculadoras HPdesempilha – remove o último elemento inserido na pilhaelemento desempilha(Pilha *p) { elemento ele= 0.0; if (pilhaVazia(*p)==false) { ele = p->itens[p->topo]; p->topo--; } else{ fprintf(stderr, MSG_PILHAVAZIA); } return ele; }
17Exemplo: Pilha das Calculadoras HPmostra topo – mostra o elemento que esta no topo da pilha
void mostraTopo(Pilha p){ if (pilhaVazia(p)==false) { printf("%5.2f\n", p.itens[p.topo]); } else { printf("Pilha Vazia: %5.2f\n", 0.0); } }
18
Exemplo: Pilha das Calculadoras HPFuncionamento das operações aritméticas
AlgoritmoFaça { Cada valor informado é empilhado Se um operador (+,- ,*,/) é informado: A calculadora tenta desempilhar os dois
últimos valores empilhados Em caso de sucesso realiza a operação correspondente com os
valores desempilhados. O resultado da operação e empilhado. O topo da pilha é mostrado } até (desligamento)
19Exemplo: Pilha das Calculadoras HPmain – implementa o algoritmo da calculadora HP
parte 1 – empilha os dígitosmain() {Pilha p1;inicializaPilha(&p1);char x;float a,b, result;char input[2];do { // loop principal: O programa permanece lendo caracteres do
teclado x = getch(); result = 0.0; if(isdigit(x)){ // se o caracter lido é um dígito empilha o mesmo printf("Empilhando %c\n", x); input[0]=x; input[1]='\0'; empilha(&p1, atof(input)); } // fim se é digito
20Exemplo: Pilha das Calculadoras HPmain – implementa o algoritmo da calculadora HPparte 2 - faz operações else { //se não eh digito if (isoperator(x)){ // se eh operador if (pilhaVazia(p1) == false) { a = desempilha(&p1); if (pilhaVazia(p1) == false) { b = desempilha(&p1); result = fazOperacao(a,b,x); empilha(&p1, result); } } } } mostraTopo(p1);} while(x !='q');}
21Exemplo: Pilha das Calculadoras HPmain – implementa o algoritmo da calculadora HPmacros – função faz Operaçãoisdigit(x) – Macro já definida na biblioteca padrão de Cisoperator(x) – Macro construída:#define isoperator(A) (((A == '+')||(A=='-')||(A=='*')||
(A=='/')) ? (true) : (false))
float fazOperacao(float a, float b, char op) { switch(op) { case '+': return a+b; case '-': return a-b; case '*': return a*b; case '/': return a/b; } }
22
Exemplo: Pilha das Calculadoras HPExercícios - Modificações
1. Nas Calculadoras HP não ocorre pilha cheia. Se não houver mais espaço, ao inserir um novo elemento os elementos na pilha são deslocado e o elemento mais antigo é descartado. Corrija o programa dado para que tenha este comportamento.
2. Adapte o programa dado para que possam ser inseridos números com mais de um dígito.
top related