• Nenhum resultado encontrado

AULA 14

N/A
N/A
Protected

Academic year: 2022

Share "AULA 14"

Copied!
36
0
0

Texto

(1)

Melhores momentos

AULA 14

(2)

Pilhas

Uma pilha (=stack) é uma lista (=sequência) dinâmica em que todas as operações (inserções, remoções e consultas) são feitas em uma mesma extremidade chamada de topo.

000000 000000 111111 111111 000000

000000 111111 111111

0000000000 0000000000 0000000000 0000000000 1111111111 1111111111 1111111111 1111111111

0000000000000000000 0000000000000000000 0000000000000000000 1111111111111111111 1111111111111111111 1111111111111111111

0000000000 0000000000 0000000000 0000000000 0000000000 0000000000

1111111111 1111111111 1111111111 1111111111 1111111111 1111111111

0000000000 0000000000 0000000000 0000000000 1111111111 1111111111 1111111111 1111111111

0000000000 0000000000 0000000000 1111111111 1111111111 1111111111

0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000

1111111111 1111111111 1111111111 1111111111 1111111111 1111111111 1111111111

desempilha (= pop) empilha (=push)

(3)

Implementação em um vetor

A pilha será armazenada em um vetor s[0 . .n-1].

00000000 00000000 0000 11111111 11111111 1111 000000000 000000000 000000000 000000000 000000000 111111111 111111111 111111111 111111111 111111111

00000 00000 00000 00000 00000 00000 00000 00000 00000

11111 11111 11111 11111 11111 11111 11111 11111 11111

00000000 00000000 0000 11111111 11111111 1111 00000 00000 00000 00000 00000 11111 11111 11111 11111 11111

00000 00000 00000 00000 00000 00000 00000 00000 00000

11111 11111 11111 11111 11111 11111 11111 11111 11111

0 t n−1

O índice t indica o topo (=top) da pilha.

Esta é a primeira posição vaga da pilha.

A pilha está vazia se t == 0.

A pilha está cheia se t == n.

(4)

AULA 15

(5)

Notação polonesa

PF 6.3

http://www.ime.usp.br/pf/algoritmos/aulas/pilha.html http://en.wikipedia.org/wiki/RPN_calculator

http://en.wikipedia.org/wiki/Shunting-yard_algorithm

(6)

Notação polonesa

Usualmente os operadores são escritos entre os operandos como em

(A + B) * D + E / (F + A * D) + C Essa é a chamada notação inxa.

Na notação polonexa ou posxa os operadores são escritos depois do operandos

A B + D * E F A D * + / + C +

(7)

Notação polonesa

Problema: Traduzir para notação posxa a expressão inxa armazenada em uma cadeia de caracteres inf.

infixa posfixa

A+B*C ABC*+

A*(B+C)/D-E ABC+*D/E- A+B*(C-D*(E-F)-G*H)-I* 3 ABCDEF-*-GH*-*+I3*- A+B*C/D*E-F ABC*D/E*+F- A+(B-(C+(D-(E+F)))) ABCDEF+-+-+

A*(B+(C*(D+(E*(F+G))))) ABCDEFG+*+*+*

(8)

Simulação

inf = expressão inxa s = pilha

posf = expressão posxa

(9)

Simulação

inf[0 . .i-1] s[0 . .t-1] posf[0 . .j-1]

( (

(A ( A

(A* (* A

(A*( (*( A

(A*(B (*( AB

(A*(B* (*(* AB

(A*(B*C (*(* ABC

(A*(B*C+ (*(+ ABC*

(A*(B*C+D (*(+ ABC*D

(A*(B*C+D) (* ABC*D+

(A*(B*C+D)) ABC*D+*

(10)

Inxa para posxa

Recebe uma expressão inxa inf e devolve a correspondente expressão posxa.

char *infixaParaPosfixa(char *inf) { char *posf; /* expressao polonesa */

int n = strlen(inf);

int i; /* percorre infixa */

int j; /* percorre posfixa */

char *s; /* pilha */

int t; /* topo da pilha */

/*aloca area para expressao polonesa*/

posf = mallocc((n+1)*sizeof(char));

/* O '+1' eh para o '\0' */

(11)

case '('

/* stackInit(n): inicializa a pilha */

s = (char*) mallocc(n * sizeof(char));

t = 0;

/* examina cada item da infixa */

for (i = j = 0; i < n; i++) { switch (inf[i]) {

char x; /* item do topo da pilha */

case '(':

/* stackPush(infixa[i]) */

s[t++] = inf[i];

break;

(12)

case ')'

case ')':

/* x = stackPop() */

while((x = s[--t]) != '(') posf[j++] = x;

break;

(13)

case '+', case '-'

case '+':

case '-':

/* !stackEmpty()

&& (stackTop()) != '('

*/while (t != 0

&& (x = s[t-1]) != '(') posf[j++] = s[--t];

/* stackPush(infixa[i]) */

s[t++] = inf[i];

break;

(14)

case '*', case '/'

case '*':

case '/':

/* !stackEmpty() &&

prec(stackTop())<=prec(infixa[i])

*/ while (t != 0

&& (x = s[t-1]) != '('

&& x != '+' && x != '-') posf[j++] = s[--t];

/* stackPush(infixa[i]) */

s[t++] = inf[i];

break;

(15)

default

default:

if(inf[i] != ' ')

posf[j++] = inf[i];

} /* fim switch */

} /* fim for (i=j=0...) */

(16)

Finalizações

/* desempilha todos os operandos que restaram */

/* !stackEmpty() */

while (t != 0)

posf[j++] = s[--t]; /* stackPop() */

posf[j] = '\0'; /* fim expr polonesa */

/* stackFree() */

free(s);

return posf;

} /* fim funcao */

(17)

Interfaces

Before I built a wall I'd ask to know What I was walling in or walling out, And to whom I was like to give oence.

Something there is that doesn't love a wall, That wants it down.

The Practice of Programming B.W.Kernigham e R. Pike

S 3.1

(18)

Interfaces

Uma interface (=interface) é uma fronteira entre entre a implementação de um biblioteca e o

programa que usa a bibliteca.

Um cliente (=interface) é um programa que chama alguma função da biblioteca.

[ . . . ] [ . . . ] [ . . . ]

[ . . . ] [ . . . ]

Implementação Interface Cliente

c = sqrt(a*a+b*b);

#include <math.h>

double sqrt(double x){

}

double sqrt(double);

double sin(double);

double cos(double);

double pow(double,double);

libm math.h prog.c

return raiz;

(19)

Interfaces

Para cada função na biblioteca o cliente precisa saber

I o seu nome, os seus argumentos e os tipos desses argumentos;

I o tipo do resultado que é retornado.

Só a quem implementa interessa os detalhes de implementação.

funcionam

Implementação Interface Cliente

Responsável por

yyy.c xxx.h

lib

sobre os protótipos das funções como as funções

Responsável por como usar as funções Os dois lados concordam

(20)

Interfaces

Entre as decisões de projeto estão

Interface: quais serviços serão oferecidos? A

interface é um contrato entre o usuário e o projetista.

Ocultação: qual informação é visível e qual é privada? Uma interface deve prover

acesso aos componente enquanto esconde detalhes de implementação que podem ser alterados sem afetar o usuário.

Recursos: quem é responsável pelo gerenciamento de memória e outros recursos?

Erros: quem detecta e reporta erros e como?

(21)

Interface item.h

/* Item.h */

typedef char Item;

(22)

Interface stack.h

/** stack.h

* INTERFACE: funcoes para manipular uma

* pilha

*/void stackInit(int);

int stackEmpty();

void stackPush(Item);

Item stackPop();

Item stackTop();

void stackFree();

void stackDump();

(23)

Inxa para posxa novamente

Recebe uma expressão inxa inf e devolve a correspondente expressão posxa.

char *infixaParaPosfixa(char *inf) { char *posf; /* expressao polonesa */

int n = strlen(inf);

int i; /* percorre infixa */

int j; /* percorre posfixa */

/*aloca area para expressao polonesa*/

posf = mallocc((n+1)*sizeof(char));

/* O '+1' eh para o '\0' */

(24)

case '('

stackInit(n) /* inicializa a pilha */

/* examina cada item da infixa */

for (i = j = 0; i < n; i++) { switch (inf[i]) {

char x; /* item do topo da pilha */

case '(':

stackPush(inf[i]);

break;

(25)

case ')'

case ')':

while((x = stackPop()) != '(') posf[j++] = x;

break;

(26)

case '+', case '-'

case '*':

case '/':

while (!stackEmpty()

&& (x = stackTop()) != '(') posf[j++] = stackPop();

stackPush(inf[i]);

break;

(27)

case '*', case '/'

case '*':

case '/':

while (!stackEmpty()

&& (x = stackTop()) != '('

&& x != '+' && x != '-') posf[j++] = stackPop();

stackPush(inf[i]);

break;

(28)

default

default:

if(inf[i] != ' ')

posf[j++] = inf[i];

} /* fim switch */

} /* fim for (i=j=0...) */

(29)

Finalizações

/* desempilha todos os operandos que restaram */

while (!stackEmpty()) posf[j++] = stackPop()

posf[j] = '\0'; /* fim expr polonesa */

stackFree();

return posf;

} /* fim funcao */

(30)

Implementação stack.c

#include <stdlib.h>

#include <stdio.h>

#include "item.h"

/** PILHA: implementacao em vetor static*/ char *s; /* pilha */

static int t;

/* t eh o indice do topo da pilha, s[t]

* eh a 1a. posicao vaga da pilha

*/

(31)

Implementação stack.c

voidstackInit(int n)

{ s = (Item*) malloc(n*sizeof(Item));

t = 0;

}

intstackEmpty() { return t == 0;

}

(32)

Implementação stack.c

voidstackPush(Item item) { s[t++] = item;

}

ItemstackPop()

{ return s[--t];

}

(33)

Implementação stack.c

ItemstackTop()

{ return s[t-1];

}

voidstackFree() { free(s);

}

(34)

Implementação stack.c

voidstackDump() { int k;

fprintf(stdout,"pilha : ");

if (t == 0) fprintf(stdout, "vazia.");

for (k = 0; k < t; k++)

fprintf(stdout, "%c ", s[k]);

fprintf(stdout,"\n");

}

(35)

Compilação

cria o obj stack.o

> gcc -Wall -O2 -ansi -pedantic -Wno-unused-result -c stack.c cria o obj polonesa.o

> gcc -Wall -O2 -ansi -pedantic -Wno-unused-result -c polonesa.c

cria o executávelpolonesa

> gcc stack.o polonesa.o -o polonesa

(36)

Makele

Hmmm. Ler o tópico Makefile no fórum.

polonesa: polonesa.o stack.o

gcc polonesa.o stack.o -o polonesa polonesa.o: polonesa.c

gcc -Wall -O2 -ansi -pedantic \ -Wno-unused-result -c polonesa.c stack.o: stack.c item.h

gcc -Wall -O2 -ansi -pedantic \ -Wno-unused-result -c stack.c

Referências

Documentos relacionados

• AGUARDANDO APROVAÇÃO: Este status é utilizado quando um DET é avaliado pelo gerente comercial da Transpes e este estipula o valor do frete, dados da data de

A correspondˆencia entre n´ umeros reais e pontos de uma reta orientada, garantida pela afirma¸c˜ ao acima, nos per- mite identificar cada ponto da reta com sua coordenada..

a) a Constituição atribui à União competência residual para instituir impostos, contribuições para a seguridade social e taxas. b) a instituição de empréstimos compulsórios

Ganhos significativos em algumas competências socioemocionais a curto prazo (relacionamento com os pares e competência social)?. Os alunos do GI com níveis médios no

A partir da discussão teórico-crítica realizada no ponto anterior, percebe-se que, na era da globalização, os impactos da fluidez, da rapidez e da aceleração são sentidos

Este é um exemplo de como se pode compreender as relações entre as propriedades da música e os parâmetros do som no pensamento willyano: com a função de compreender as partes do

A memória Intel Optane H10 com armazenamento em estado sólido funciona tanto como um cache/acelerador de armazenamento não volátil (que permite velocidades de

Para participação do conclave virtual os credores deverão atender aos seguintes passos: 1 Encaminhar a documentação acima, via eletrônica, aos e-mails [email protected]