• Nenhum resultado encontrado

AULA 9

N/A
N/A
Protected

Academic year: 2022

Share "AULA 9"

Copied!
30
0
0

Texto

(1)

AULA 9

(2)

Pilhas

Fonte: http://dontmesswithtaxes.typepad.com/

PF 6.1 e 6.3

http://www.ime.usp.br/pf/algoritmos/aulas/pilha.html

(3)

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)

(4)

Pilhas

Assim, o primeiro objeto a ser removido de uma pilha é o último que foi inserido. Esta política de manipulação é conhecida pela sigla LIFO

(=Last In First Out)

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)

(5)

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.

(6)

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

Para remover (=desempilhar=pop) um elemento faça x = s[--t];

que é equivalente a t -= 1;

x = s[t];

(7)

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

Para inserir (=empilhar=push) um elemento faça s[t++] = x;

que é equivalente a s[t] = x;

t += 1;

(8)

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

Para consultar um elemento, sem removê-lo, faça x = s[t-1];

(9)

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

Tentar desempilhar de uma pilha que está vazia é um erro chamado stack underow

Tentar empilhar em uma pilha cheia é um erro chamado stack overow

(10)

Pilha de execução

Fonte: http://meta.stackexchange.com/

PF 6.5

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

(11)

Pilha de execução

Para executar um programa, o computador utiliza uma pilha de execução (=execution stack=call stack).

Fonte:http://en.wikipedia.org/wiki/File:ProgramCallStack2.png

(12)

Pilha de execução

Uma pilha de execução é usada para armazenar:

I variáveis locais das funções ativas;

I parâmetros das funções ativas;

I endereço de retorno para o ponto em que as funções foram chamadas;

I cálculo de expressões;

(13)

Exemplo

int main (void) { int i, j, k, y;

i = 111; j = 222; k = 444;

y = /*1*/ F (i, j, k) /*4*/;

printf ("%d\n", y);

return EXIT_SUCCESS;

}int G (int a, int b) { int x;

x = a + b;

return x;

}int F (int i, int j, int k) { int x;

x = /*2*/ G (i, j) /*3*/;

x = x + k;

return x;

}

(14)

Saida

?

?

?

?

?

?

?

?

?

?

?

?

?

?

end. retorno

(15)

Saida

?

?

?

?

?

?

?

?

?

?

?

?

?

main end. retorno

i j k y

010101010

(16)

Saida

?

?

?

?

?

?

?

?

?

?

main end. retorno

i j k y

010101010 444

222 111

(17)

Saida

?

?

?

?

?

?

main end. retorno

i j k y

010101010 444

222 111 end. retorno

i kj x

222 444 111

F /*4*/

(18)

Saida

?

?

main end. retorno

i j k y

010101010 444

222 111 end. retorno

i kj x

222 444 111

F end. retorno

x b a

/*4*/

/*3*/

? 111

222 G

(19)

Saida

?

?

main end. retorno

i j k y

010101010 444

222 111 end. retorno

i kj x

222 444 111

F end. retorno

x b a

/*4*/

/*3*/

111 222 333

G

(20)

Saida

?

main end. retorno

i j k y

010101010 444

222 111 end. retorno

i kj x

222 444 111

F /*4*/

333

?

?

?

?

(21)

Saida

?

main end. retorno

i j k y

010101010 444

222 111 end. retorno

i kj x

222 444 111

F /*4*/

?

?

?

? 777

(22)

Saida

main end. retorno

i j k y

010101010 444

222 111

?

?

?

?

777

?

?

?

?

?

(23)

Saida

?

?

?

?

?

?

?

?

?

777

end. retorno

?

?

?

?

?

(24)

Exercício

Qual o erro na função a seguir?

CelPixel *

inserir(CelPixel *p, int a, int b) { CelPixel novo;

novo.x = a;

novo.y = b;

novo.prox = p;

return &novo;

}

(25)

Aviso

meu_prompr> gcc -Wall -ansi -O2 -pedantic ...In function 'inserir':

warning: function returns address of local variable [enabled by default]

(26)

Notação polonesa (reversa)

Fonte: http://www.quickmeme.com/ e http://danicollinmotion.com/

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

(27)

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 dos operandos

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

(28)

Notação polonesa

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

Suponha que na expressão só ocorrem os operadores binários '+', '-', '*', '/' além de '(' e ')'.

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+*+*+*

(29)

Simulação

inf = expressão inxa s = pilha

posf = expressão posxa

(30)

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+*

Referências

Documentos relacionados

• REXX em TSO/E usa uma estrutura de dados expansível chamada uma pilha de dados para armazenar a informação (Data Stack ou Stack Area).. • A pilha de dados combina características

[r]

Pilha (Stack): A pilha é um local onde são armazenados os endereços de retorno nas instruções de salto ou desvio.. A pilha dos

Para inserir o contexto da unidade de pilha especificada ou de todas as unidades de pilha, insira o comando stack unit no modo de Configuração Global inserindo o

No presente estudo não foram utilizados os valores de percentis para a predição da dificuldade de movimento; a medida de desempenho foi o Escore Padrão (EP) para o desempenho total

As atividades a seguir fazem parte de um conjunto de dez tarefas que foram trabalhadas com os sujeitos da pesquisa, alunos de uma turma de 9º ano do ensino

Área interna localizada no Parque Villa-Lobos, denominada “Quadra Basquete”, contendo 01 (uma) quadra basquete, com área total de 511 m², com estrutura em piso de concreto

Pilha, Stack Pointer e