Aula 10

1  Resumo da matéria

1.1  Pilhas e seus usos

Definição
Implementação
Referir implementação anterior como exercício.
Usos
Emparelhamento de parênteses.
Cálculo de expressões (versão simples vs. versão complicada).
Prefixo (prefix), infixo, sufixo.
Prefixo: notação Polaca
Infixo: usual
Sufixo: notação Polaca reversa
Cálculo de expressões sem parênteses completos.

1.2  Leitura recomendada

Recomenda-se a leitura dos Capítulos 7 (pilhas) e 8 (leitura independente sobre filas) de [1].

2  Exercícios

1.  Pretende-se criar um programa que detecte o âmbito (ou visibilidade) de variáveis num programa em C++.  Para simplificar considera-se que os programas em C++ foram pré-processados de modo a ficarem
com o seguinte aspecto (os número de linhas não fazem parte do programa!):
 1
 2  {
 3  x y
 4
 5  {
 6  a
 7  b
 8  }
 9  {
10  t
11  { r }
12  h}
13  c
14  }
em que cada letra representa a declaração de uma variável.

A saída do programa deverá ser:

Declaração de x na linha 3
Declaração de y na linha 3
Declaração de a na linha 6
Declaração de b na linha 7
Fim de âmbito de b, a na linha 8
Declaração de t na linha 10
Declaração de r na linha 11
Fim de âmbito de r na linha 11
Declaração de h na linha 12
Fim de âmbito de h, t na linha 12
Declaração de c na linha 13
Fim de âmbito de c, y, x na linha 14
Sugestão:  Use uma pilha de caracteres para guardar os nomes das variáveis.  Quando aparece no programa um '{' insere na pilha um sinal de início de âmbito (por exemplo o próprio '{').  Quando aparece uma variável insere o seu nome na pilha.  Quando termina um âmbito (ou seja, quando aparece um '}') tem apenas de desempilhar até encontrar um sinal de início de âmbito.

Opcionalmente pode, cada vez que encontrar um '?' no ficheiro, mostrar todas as variáveis declaradas no respectivo bloco até ao momento.  Para resolver esta parte do exercício isso poderá usar duas pilhas.  Pode ainda tornar o programa mais poderoso se, de cada vez que encontrar '!', mostrar todas as variáveis visíveis nesse ponto (admite-se que uma variável de um bloco é visível dentro de qualquer sub-bloco do mesmo bloco após a sua declaração).

3  Referências

[1]  Michael Main e Walter Savitch, "Data Structures and Other Objects Using C++", Addison-Wesley, Reading Massachusetts, 1997. #

# Existem 10 exemplares na biblioteca do ISCTE.