Anda di halaman 1dari 22

1

Tipos Abstratos de Dados


Pilhas e Filas
TPA 2008 1
Prof. Mateus Costa

Pilhas
Comportamento: O ltimo que chega o
primeiro que sai.
O comportamento da pilha pode ser especificado por
3 operaes:
Empilha (push): Insere um elemento na pilha
Desempilha (pop) : remove o ltimo elemento que foi
inserido na pilha
PilhaVazia: operao lgica: retorna verdadeiro se no h
nenhum elemento na pilha e falso caso contrrio.

Pilhas

A restrio fundamental: o elemento a ser


removido sempre o ltimo que foi inserido
Obedecendo esta regra, no importa a estrutura de
armazenamento utilizada.

Pilhas Implementao com Arranjos estticos


Considerando a implementao utilizao de
arranjos estticos para a implementao 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
usurio.

As posies do arranjo sero utilizados para o


armazenamento dos dados
Deve-se ter uma varivel para indicar o topo da pilha:
A varivel deve ser do mesmo tipo do ndice do arranjo
Normalmente o tipo inteiro.

Para manter todas as informaes da pilha definidas em


uma nica estrutura devemos definir um tipo Pilha
contendo o arranjo e a varivel topo.

Pilhas Implementao com Arranjos estticos


Pilha com um arranjo.
Tamanho mximo da pilha: 6
5
4
3
2
1

topo

Pilhas Implementao com Arranjos estticos


Definio do tipo para uma Pilha de inteiros
#define MAX 6 // tamanho mximo da Pilha
#define TRUE 1
#define FALSE 0
typedef int Elemento; // tipo a ser armazenado
typedef struct {
int topo;
Elemento itens[MAX];
} Pilha;

Pilhas Implementao com Arranjos estticos


Interface do TAD Pilha:
int pilhaCheia(Pilha);
int pilhaVazia(Pilha);
void inicializaPilha(Pilha *);
void empilha (Pilha *, Elemento);
Elemento desempilha (Pilha *, Elemento);
Elemento mostraTopo(Pilha);

Pilhas Implementao com Arranjos estticos


Implementao das operaes:
void inicializaPilha(Pilha *p) {
p->topo=0;
}

int pilhaCheia(Pilha){
if (Pilha.topo==MAX) {
return TRUE;
}
else {
return FALSE;
}

Pilhas Implementao com Arranjos estticos


int pilhaVazia(Pilha p) {
if(p.topo==0) {
return TRUE;
}
else {
return FALSE;
}
}

10

Pilhas Implementao com Arranjos estticos


void empilha (Pilha *p, Elemento ele){
if (pilhaCheia(*p)==FALSE) {
p->itens[p->topo] = ele;
p->topo++;
}
else{
fprintf(stderr, Pilha Cheia);
}
}

11

Pilhas Implementao com Arranjos estticos


Elemento desempilha(Pilha *p) {
Elemento ele = 0;
if (pilhaVazia(*p)==FALSE) {
ele = p->itens[p->topo];
p->topo--;
}
else{
fprintf(stderr, MSG_PILHAVAZIA);
}
return ele;
}

Exemplo: Pilha das Calculadoras HP


Tamanho 4
Tipo Bsico: 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;

12

13

Exemplo: Pilha das Calculadoras HP


Operaes
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);

14

Exemplo: Pilha das Calculadoras HP:


Inicializa Pilha (topo = -1) - Pilha Cheia Pilha Vazia
void 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 HP


empilha 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);
}

Exemplo: Pilha das Calculadoras HP


desempilha remove o ltimo elemento inserido na
pilha
elemento 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;
}

16

Exemplo: Pilha das Calculadoras HP


mostra 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);
}
}

17

18

Exemplo: Pilha das Calculadoras HP


Funcionamento das operaes aritmticas
Algoritmo
Faa {
Cada valor informado empilhado
Se um operador (+,- ,*,/) informado:
A calculadora tenta desempilhar os dois ltimos
valores empilhados
Em caso de sucesso
realiza a operao correspondente com os valores
desempilhados.
O resultado da operao e empilhado.
O topo da pilha mostrado
} at (desligamento)

Exemplo: Pilha das Calculadoras HP


main implementa o algoritmo da calculadora HP
parte 1 empilha os dgitos
main() {
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 dgito empilha o mesmo
printf("Empilhando %c\n", x);
input[0]=x;
input[1]='\0';
empilha(&p1, atof(input));
} // fim se digito

19

Exemplo: Pilha das Calculadoras HP


main implementa o algoritmo da calculadora HP
parte 2 - faz operaes
else { //se no 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');
}

20

Exemplo: Pilha das Calculadoras HP


main implementa o algoritmo da calculadora HP
macros funo faz Operao

21

isdigit(x) Macro j definida na biblioteca padro de C


isoperator(x) Macro construda:
#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 HP


Exerccios - Modificaes

1. Nas Calculadoras HP no ocorre pilha cheia.


Se no houver mais espao, ao inserir um
novo elemento os elementos na pilha so
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 nmeros com mais de um dgito.

Anda mungkin juga menyukai