Você está na página 1de 7

Estrutura de Dados – Básica

Professor: Osvaldo Kotaro Takai.

Aula 8: Pilhas com Alocação de Memória Estática

O objetivo desta aula é apresentar estrutura de dados Pilha e suas aplicações.

Introdução

Embora algumas vezes a palavra “pilha” seja popularmente utilizada para representar um amontoado de coisas sem nenhuma organização, como exemplifica a frase abaixo; em Estrutura de Dados, esta palavra identifica um conjunto de dados organizados sequencialmente e que são acessados segundo um critério bem definido. Esse critério de acesso é denominado LIFO (Last-In, First-Out – O último a entrar é o primeiro a sair).

“Os três sujeitos que ali estavam em trempe, no centro da p ilha de gente, eram tidos e havidos pelo bom povo fluminense como as três grandes luminárias da época.” (O Garatuja, José de Alencar, 1873).

Motivação

época.” (O Garatuja, José de Alencar, 1873). Motivação Um entregador de pizzas (motoboy ) experiente provavelmente

Um entregador de pizzas (motoboy) experiente provavelmente organizará as pizzas de acordo com a sua rota de entrega. Suponha que ele tenha que entregar 4 pizzas para 4 clientes diferentes de acordo com a seguinte rota:

Rota de Entrega:

1ª parada: Portuguesa 2ª parada: Margueritta 3ª parada: 4 Queijos 4ª parada: Lombo Catupiry

Assim, a primeira pizza que o motoboy irá colocar no bagageiro de sua moto é o de Lombo Catupiry; a segunda será a de 4 Queijos; a terceira a Margueritta, e a última a Portuguesa.

4ª pizza colocada Portuguesa Topo 3ª pizza colocada Margueritta 2ª pizza colocada 4 Queijos 1ª
4ª pizza colocada
Portuguesa
Topo
3ª pizza colocada
Margueritta
2ª pizza colocada
4 Queijos
1ª pizza colocada
Lombo Catupiry
Pilha de Pizzas

Em sua primeira parada, o motoboy entregará a pizza que está no topo da pilha (Portuguesa), deixando a configuração da Pilha de Pizzas da seguinte forma:

1

3ª pizza colocada Margueritta 2ª pizza colocada 4 Queijos 1ª pizza colocada Lombo Catupiry Pilha
3ª pizza colocada
Margueritta
2ª pizza colocada
4 Queijos
1ª pizza colocada
Lombo Catupiry
Pilha de Pizzas

Topo

Na segunda parada, o motoboy irá, novamente, entregar a pizza que está no topo da pilha, agora a pizza Margueritta. Esse processo irá se repetir até a pilha ficar vazia.

Observações:

A ordem das pizzas é importante.

A última pizza a entrar na pilha foi a primeira a sair (LIFO: Last-in, First-Out).

Como neste exemplo, existem vários outros problemas do mundo real que se utiliza de pilhas.

A solução para esse tipo de problema muitas vezes imita esse mesmo comportamento; pois

quanto mais próximo for o modelo de sua realidade, mais fácil será a solução computacional.

Definição do Tipo Abstrato de Dados Pilha

Uma TAD Pilha é um conjunto de n elementos (ou nós): x 0 , x 1 ,

, x n-1 , cuja propriedade

estrutural envolve as posições relativas de seus nós. Supondo n > 0, temos que:

1. X 0 é o primeiro nó.

2. para 0 < k < n, x k é precedido por x k 1 e seguido por x k +1

3. x n-1 é o último nó e topo = n – 1.

4. topo = -1 indica que a Pilha está vazia.

5. Algumas operações possíveis:

a. Criar Pilha vazia.

b. Destruir Pilha.

c. Esvaziar Pilha.

d. Verificar se a Pilha está vazia.

e. Verificar se a Pilha está cheia.

f. Retornar tamanho da Pilha.

g. Retornar nó do topo.

h. Empilhar.

i. Desempilhar.

Implementação estática do TAD Pilha em C++

O TAD Pilha será implementado utilizando variáveis estáticas, no caso um vetor. A sua

implementação dinâmica será estudada na aula 10.

A implementação do TAD Pilha, descrita abaixo em linguagem C++, foi dividida em dois

arquivos. O primeiro, main.cpp, utiliza o TAD Pilha, criando duas pilhas p e p1 de duas formas diferentes, empilha (push) e desempilha (pop) alguns valores e, no final, tenta desempilhar um nó de uma pilha vazia. Naturalmente, isso irá gerar um erro conhecido como underflow de pilha. Por outro lado, o TAD Pilha também está preparado para gerar um erro quando se tenta

empilhar mais do que o tamanho possível. Tal erro é conhecido como overflow de pilha.

O segundo arquivo, pilha.h, contém a implementação do TAD Pilha.

As explicações dos exemplos a seguir serão realizadas durante as aulas práticas em laboratório.

2

Arquivo 1: main.cpp

Arquivo 1 : main.cpp 3

3

Arquivo 2: pilha.h

Arquivo 2 : pilha.h 4

4

TAD Pilha como uma classe genérica

A implementação acima permite empilhar números do tipo int. Se precisássemos empilhar, por exemplo, float, char ou strict cliente, teríamos que criar um TAD Pilha para cada um desses tipos, embora a estrutura do programa seja idêntica. Para solucionar esse problema, a linguagem C++ permite passar um tipo de dados como parâmetro da classe. Assim, quando fôssemos criar uma nova pilha, poderíamos indicar o tipo de dados dos nós como parâmetro. Uma classe definida dessa forma é conhecida como classe parametrizada ou classe genérica.

Arquivo 1: main.cpp

Uma classe definida dessa forma é conhecida como classe parametrizada ou classe genérica. Arquivo 1 :
Uma classe definida dessa forma é conhecida como classe parametrizada ou classe genérica. Arquivo 1 :

5

Arquivo 2: pilhaGenerica.h

Arquivo 2 : pilhaGenerica.h 6

6

Preparação para os exercícios

Notações de expressões aritméticas

Notação completamente Parentizada: acrescenta-se sempre um par de parênteses a cada par de operandos e seu operador. Exemplo:

tradicional: A * B – C / D parentizada: ((A*B) – (C/D))

Notação Polonesa: os operandos aparecem imediatamente antes dos operandos. Esta notação especifica quais operadores, e em que ordem, devem ser calculados. Por esse motivo dispensa o uso de parênteses, sem ambiguidades. Exemplo:

tradicional: A * B – C / D polonesa: – * A B / C D

Notação Polonesa Reversa (ou posfix): é como a polonesa na qual os operandos aparecem após os operandos. Exemplo:

tradicional: A * B – C / D polonesa reversa: A B * C D / –

Exercícios

1. Incremente os programas main.cpp dos exemplos apresentados, de forma a verificar se todas as operações do TAD Pilha estão funcionando corretamente. Caso necessário utilize o recurso de depuração (debug) do IDE Dev-C++.

2. Escreva um programa que verifique se as expressões aritméticas estão com a parentização correta. Seu programa deve checar expressões para ver se cada "abre parênteses" tem um "fecha parênteses" correspondente.

3. Escreva um programa que converta uma expressão escrita na notação parentizada no seu equivalente na notação polonesa reversa.

4. Escreva um programa que dada uma expressão aritmética tradicional, avalie seu valor. Por exemplo, 3+4*(4/2), deverá gerar como resultado: 11.

7