96
José Augusto Baranauskas Departamento de Física e Matemática – FFCLRP-USP [email protected] http://dfm.ffclrp.usp.br/~augusto Algoritmos e Estruturas de Dados I Pilhas Pilhas Nesta aula veremos o ADT pilha Uma pilha é usada em muitas situações tais como avaliação de expressões aritméticas, chamada e retorno de procedimentos e funções e busca exaustiva (backtracking)

Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

  • Upload
    buiphuc

  • View
    223

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

José Augusto BaranauskasDepartamento de Física e Matemática – FFCLRP-USP

[email protected]://dfm.ffclrp.usp.br/~augusto

Algoritmos eEstruturas de Dados I

PilhasPilhas

Nesta aula veremos o ADT pilhaUma pilha é usada em muitas situações tais como avaliação de expressões aritméticas, chamada e retorno de procedimentos e funções e busca exaustiva (backtracking)

Page 2: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

2

OrganizaçãoOrganização

Definição do ADT PilhaEspecificação

Operações sobre o ADT Pilha, utilizando pré- e pós-condições

ImplementaçãoEstática (contígua)Dinâmica (encadeada)

Page 3: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

3

DefiniçãoDefinição

Uma pilha (stack) é uma estrutura de dados na qual todas inserções e remoções de dados são efetuadas numa única extremidade, denominada topo(top) da pilha

Page 4: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

4

ExemploExemplo

Por exemplo, pense numa pilha de pratos comumente encontrada em restaurantes do tipo self-service

Page 5: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

5

ExemploExemplo

Por exemplo, pense numa pilha de pratos comumente encontrada em restaurantes do tipo self-serviceOs pratos são colocados sempre no topo da pilha pelos empregados...

Page 6: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

6

ExemploExemplo

Por exemplo, pense numa pilha de pratos comumente encontrada em restaurantes do tipo self-serviceOs pratos são colocados sempre no topo da pilha pelos empregados...

Page 7: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

7

ExemploExemplo

Por exemplo, pense numa pilha de pratos comumente encontrada em restaurantes do tipo self-serviceOs pratos são colocados sempre no topo da pilha pelos empregados...

Page 8: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

8

ExemploExemplo

Por exemplo, pense numa pilha de pratos comumente encontrada em restaurantes do tipo self-serviceOs pratos são colocados sempre no topo da pilha pelos empregados...

Page 9: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

9

ExemploExemplo

Por exemplo, pense numa pilha de pratos comumente encontrada em restaurantes do tipo self-serviceOs pratos são colocados sempre no topo da pilha pelos empregados...

Page 10: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

10

ExemploExemplo

Por exemplo, pense numa pilha de pratos comumente encontrada em restaurantes do tipo self-serviceOs pratos são colocados sempre no topo da pilha pelos empregados e são retirados a partir do topo pelos clientesO prato localizado no fundo da pilha foi o primeiro a ser colocado na pilha e é o último a ser retirado

Page 11: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

11

Operações FundamentaisOperações Fundamentais

Quando um item é adicionado numa pilha, usa-se a operação Push(inserir)

Page 12: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

12

Operações FundamentaisOperações Fundamentais

Quando um item é adicionado numa pilha, usa-se a operação Push(inserir)Quando um item é retirado de uma pilha, usa-se a operação Pop (retirar)

Page 13: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

13

LIFOLIFO

O último item inserido (Push) na pilha é sempre o primeiro a ser retirado (Pop)Esta propriedade é denominada Last In, First Out (último a entrar, primeiro a sair) ou LIFO

Page 14: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

14

ExemploExemplo

pilha vazia inicialmente

topo

Page 15: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

15

ExemploExemplo

pilha vazia inicialmenteinserir (push) caixa Q

Qtopo

Page 16: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

16

ExemploExemplo

pilha vazia inicialmenteinserir (push) caixa Qinserir (push) caixa A

Q

topo A

Page 17: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

17

ExemploExemplo

pilha vazia inicialmenteinserir (push) caixa Qinserir (push) caixa Aremover (pop) uma caixa

Qtopo

A

Page 18: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

18

ExemploExemplo

pilha vazia inicialmenteinserir (push) caixa Qinserir (push) caixa Aremover (pop) uma caixaremover (pop) uma caixa

Q

topo

Page 19: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

19

ExemploExemplo

pilha vazia inicialmenteinserir (push) caixa Qinserir (push) caixa Aremover (pop) uma caixaremover (pop) uma caixainserir (push) caixa R

Rtopo

Page 20: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

20

ExemploExemplo

pilha vazia inicialmenteinserir (push) caixa Qinserir (push) caixa Aremover (pop) uma caixaremover (pop) uma caixainserir (push) caixa Rinserir (push) caixa D

RDtopo

Page 21: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

21

ExemploExemplo

pilha vazia inicialmenteinserir (push) caixa Qinserir (push) caixa Aremover (pop) uma caixaremover (pop) uma caixainserir (push) caixa Rinserir (push) caixa Dremover (pop) uma caixa R

D

topo

Page 22: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

22

ExemploExemplo

pilha vazia inicialmenteinserir (push) caixa Qinserir (push) caixa Aremover (pop) uma caixaremover (pop) uma caixainserir (push) caixa Rinserir (push) caixa Dremover (pop) uma caixainserir (push) caixa M

R

topo M

Page 23: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

23

ExemploExemplo

pilha vazia inicialmenteinserir (push) caixa Qinserir (push) caixa Aremover (pop) uma caixaremover (pop) uma caixainserir (push) caixa Rinserir (push) caixa Dremover (pop) uma caixainserir (push) caixa M

R

topo M

Estado finalda pilha

Page 24: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

24

Exemplo: Invertendo uma LinhaExemplo: Invertendo uma Linha

Suponha que você precisa de um procedimento que leia uma linha e escreva-a de forma reversa (de trás para frente)Isto pode ser feito simplesmente inserindo (push) cada caracter numa pilha à medida que ele é lidoQuando a linha estiver terminada, basta retirar (pop) os caracteres da pilha e eles virão em ordem reversa

Page 25: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

25

Invertendo uma LinhaInvertendo uma Linha

void ReverseRead()// Dada uma linha fornecida pelo usuário, escreve-a em ordem reversa{ Stack line;char ch;

while (! cin.eof() && ! line.Full()){ cin >> ch; // Inserir cada caracter da linha para a pilha

line.Push(ch);}cout << "\nEsta é a linha em ordem reversa:\n";while (! line.Empty()){ line.Pop(ch); // Retirar cada caracter da pilha e escrevê-lo

cout << ch;}cout << endl;

} // end ReverseRead

Page 26: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

26

InformationInformation HidingHiding

Note que o procedimento ReverseRead foi escrito antes de se considerar como realmente a pilha foi implementadaIsto é um exemplo de ocultamento de informação (information hiding)Se alguém já escreveu os métodos para manipulação de pilhas, então podemos usá-los sem conhecer os detalhes de como as pilhas são mantidas na memória ou como as operações em pilhas são realmente efetuadas

Page 27: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

27

InformationInformation HidingHiding

Information hiding facilita a mudança de implementação: se uma implementação é mais eficiente, então apenas as declarações e os métodos de manipulação de pilhas serão alteradosO programa torna-se mais legível: o aparecimento das palavras Push e Pop alertam quem está lendo sobre o que está ocorrendoSeparando o uso de estruturas de dados da sua implementação ajuda a melhorar o projeto top-down (do nível maior de abstração para o menor; do menor detalhamento para o maior) tanto de estruturas de dados quanto de programas

Page 28: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

28

EspecificaçãoEspecificação

Operações:CriaçãoDestruiçãoStatusOperações BásicasOutras Operações

Page 29: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

29

CriaçãoCriação

Stack::Stack();pré-condição: nenhumapós-condição: Pilha é criada e iniciada como vazia

Page 30: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

30

DestruiçãoDestruição

Stack::~Stack();pré-condição: Pilha já tenha sido criadapós-condição: Pilha é destruída

Page 31: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

31

StatusStatus

bool Stack::Empty();pré-condição: Pilha já tenha sido criadapós-condição: função retorna true se a pilha está vazia; false caso contrário

Page 32: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

32

StatusStatus

bool Stack::Full();pré-condição: Pilha já tenha sido criadapós-condição: função retorna true se a pilha está cheia; false caso contrário

Page 33: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

33

Operações BásicasOperações Básicas

void Stack::Push(StackEntry x);pré-condição: Pilha já tenha sido criada e não está cheiapós-condição: O item x é armazenado no topo da pilha

O tipo StackEntry depende da aplicação e pode variar

desde um simples caracter ounúmero até uma struct ouclass com muitos campos

Page 34: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

34

Operações BásicasOperações Básicas

void Stack::Pop(StackEntry &x);pré-condição: Pilha já tenha sido criada e não está vaziapós-condição: O item no topo da pilha é removido e seu valor é retornado na variável x

Page 35: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

35

Outras OperaçõesOutras Operações

void Stack::Clear();pré-condição: Pilha já tenha sido criadapós-condição: todos os itens da pilha são descartados e ela torna-se uma pilha vazia

Page 36: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

36

Outras OperaçõesOutras Operações

int Stack::Size();pré-condição: Pilha já tenha sido criadapós-condição: a função retorna o número de itens na pilha

Page 37: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

37

Outras OperaçõesOutras Operações

void Stack::Top(StackEntry &x);pré-condição: Pilha já tenha sido criada e não está vaziapós-condição: A variável x recebe uma cópia do item no topo da pilha; a pilha permanece inalterada

Page 38: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

38

Uma analogia útil para uma pilha consiste em pensar em uma pilha de pratos: os pratos são colocados e retirados sempre a partir do topo da pilhaAs operações básicas são Push (insere um elemento na pilha) e Pop (retira um elemento da pilha)

Pontos ImportantesPontos Importantes

Page 39: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

39

Implementação ContíguaImplementação Contígua

Veremos inicialmente os detalhes de implementação de pilhas utilizando vetores (arrays)Este tipo de implementação é também denominada estática e contígua (ou seqüencial)Logo a seguir, veremos a implementação encadeada dinâmica de pilhas

Page 40: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

40

As entradas em uma pilha serão armazenadas no início de um vetor, como mostra este exemplo

[ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] . . .

Um vetor de inteiros

4 8 10

Nós não nos interessamos para o queestá armazenado nesta parte do vetor

4810

Implementação ContíguaImplementação Contígua

Page 41: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

41

As entradas possuem ordem. A figura abaixo nãorepresenta a mesma pilha que a anterior...

[ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] . . .

10 84

1048

Implementação ContíguaImplementação Contígua

Um vetor de inteirosNós não nos interessamos para o queestá armazenado nesta parte do vetor

Page 42: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

42

Assim...

1048

4810 ≠

Implementação ContíguaImplementação Contígua

Page 43: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

43

Nós precisamos também armazenar o topo da pilha

[ 1 ] [ 2 ] [ 3 ] [ 4 ] [5 ] [ 6 ] . . .

Um vetor de inteiros

4 8 10

Nós não nos interessamos para o queestá armazenado nesta parte do vetor

Um inteiro armazenao topo da pilha

3 4810

Implementação ContíguaImplementação Contígua

Page 44: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

44

QuestãoQuestão

Utilize estas idéias para escrever uma declaração de tipo que poderia implementar o tipo de dado pilha. A declaração deve ser um objeto com dois campos de dados. Faça uma pilha capaz de armazenar 100 inteiros

Você tem 3 minutospara escrever a declaração

Page 45: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

45

Uma SoluçãoUma Solução

const int MaxStack = 100;class Stack{ public:

Stack();void Push(int x);void Pop(int &x); ...

private:int top; // topo da pilhaint Entry[MaxStack+1]; // vetor com elementos

};

Page 46: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

46

Uma SoluçãoUma Solução

const int MaxStack = 100;class Stack{ public:

Stack();void Push(int x);void Pop(int &x); ...

private:int top; // topo da pilhaint Entry[MaxStack+1]; // vetor com elementos

};

Observe que o tipoStackEntry nesse caso éum inteiro

Page 47: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

47

CriaçãoCriação

Stack::Stack()

A pilha deve iniciar vazia. A convençãoé que top = 0

0

[ 1 ] [ 2 ] [ 3 ] . . .

Entry

top

Stack::Stack()

{

top = 0;

}

Page 48: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

48

Destruidor Destruidor

Stack::~Stack()

Usando alocação estática para implementar a pilha (vetor), o destruidornão será necessário. Em todo caso, colocaremos apenas uma mensagem queo objeto foi destruído

[ 1 ] [ 2 ] [ 3 ] . . . Stack::~Stack()

{

cout << “Pilha destruída”;

}

Entry

top

Page 49: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

49

Status: Status: EmptyEmpty

bool Stack::Empty()

Lembre-se que a pilha iniciavazia, com top = 0...

0

[ 1 ] [ 2 ] [ 3 ] . . . bool Stack::Empty()

{

return (top == 0);

}

Entry

top

Page 50: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

50

Status: Status: FullFull

bool Stack::Full()

...e que MaxStack é o númeromáximo de elementos da pilha

3

[ 1 ] [ 2 ] [ 3 ] . . . bool Stack::Full()

{

return (top == MaxStack);

}

8 4 10Entry

top

Page 51: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

51

Operações Básicas: Operações Básicas: PushPush

void Stack::Push(int x)

2

[ 1 ] [ 2 ] [ 3 ] . . .

8 4

Nós fazemos uma chamada aPush(17)

Quais valores serão armazenados emEntry e topdepois que a chamada de procedimento termina?

Entry

top

Page 52: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

52

Operações Básicas: Operações Básicas: PushPush

void Stack::Push(int x)

Depois da chamada a Push(17),nós teremos esta pilha:

2

[ 1 ] [ 2 ] [ 3 ] . . .

8 4

3

[ 1 ] [ 2 ] [ 3 ] . . .

8 4 17Entry

top

Page 53: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

53

Operações Básicas: Operações Básicas: PushPush

void Stack::Push(int x)

Antes de inserir, é conveniente verificar se há espaço na pilha

2

[ 1 ] [ 2 ] [ 3 ] . . .

void Stack::Push(int x){ if (Full())

{ cout << “Pilha Cheia”;abort();

}...

}

8 4Entry

top

Page 54: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

54

Operações Básicas: Operações Básicas: PushPush

void Stack::Push(int x)

Se houver, basta inserir napróxima posição livre do vetor

3

[ 1 ] [ 2 ] [ 3 ] . . .

void Stack::Push(int x){ if (Full())

{ cout << “Pilha Cheia”;abort();

}

top++;Entry[top] = x;

}

8 4 17Entry

top

Page 55: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

55

Operações Básicas: PopOperações Básicas: Pop

void Stack::Pop(int &x)

3

[ 1 ] [ 2 ] [ 3 ] . . .

8 4

Nós fazemos uma chamada aPop(x)

Quais valores serão armazenados emEntry, top e xdepois que a chamada de procedimento termina?

17Entry

top

Page 56: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

56

Operações Básicas: PopOperações Básicas: Pop

void Stack::Pop(int &x)

Depois da chamada a Pop(x),nós teremos esta pilha:

3

[ 1 ] [ 2 ] [ 3 ] . . .

8 4

2

[ 1 ] [ 2 ] [ 3 ] . . .

8 4

17x

17Entry

top

Page 57: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

57

Operações Básicas: PopOperações Básicas: Pop

void Stack::Pop(int &x)

Antes de remover, é conveniente verificar se a pilha não está vazia

3

[ 1 ] [ 2 ] [ 3 ] . . .

void Stack::Pop(int &x){ if (Empty())

{ cout << “Pilha Vazia”;abort();

}...

}

8 4 17

x

Entry

top

Page 58: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

58

Operações Básicas: PopOperações Básicas: Pop

void Stack::Pop(int &x)

Se não estiver vazia, basta retiraro elemento do topo do vetor

2

[ 1 ] [ 2 ] [ 3 ] . . .

void Stack::Pop(int &x){ if (Empty())

{ cout << “Pilha Vazia”;abort();

}

x = Entry[top] ;top = top - 1;

}

8 4

17x

Entry

top

Page 59: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

59

ExercíciosExercícios

Defina a operação Clear utilizando apenas as operações Empty e PopDefina a operação Clear utilizando diretamente com os campos do objeto (vetor e topo)Defina a operação Top utilizando apenas Push e Pop e EmptyDefina a operação Top utilizando diretamente com os campos do objeto (vetor e topo)Defina a operação SizeQuais as vantagens e desvantagens de cada uma destas construções?

Page 60: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

60

Solução Solução ClearClear

Usando apenas Emptye Pop

void Stack::Clear(){ int x;

while(! Empty())Pop(x);

}

Utilizando campos do objeto

void Stack::Clear(){

top = 0;}

Page 61: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

61

Solução Solução TopTop

Usando apenas Pushe Pop

void Stack::Top(int &x){ if(Empty())

{ cout << “Pilha vazia”;abort();

}Pop(x);Push(x);

}

Utilizando campos do objeto

void Stack::Top(int &x){ if(top == 0)

{ cout << “Pilha vazia”;abort();

}x = Entry[top];

}

Page 62: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

62

Solução Solução SizeSize

int Stack::Size(){

return top;}

Page 63: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

63

Até este ponto vimos uma forma de implementação de pilhas, usando vetoresA vantagem de usar vetores é a simplicidade dos programasUma desvantagem deste tipo de implementação é que o tamanho da pilha é definido a priori pelo programador, desperdiçando espaço não utilizadoNos próximos slides, veremos uma implementação diferente, que otimiza a quantidade de memória utilizada

Pontos ImportantesPontos Importantes

Page 64: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

64

Implementação DinâmicaImplementação Dinâmica

As entradas são colocadas em uma estrutura (StackNode) que contém um campo com o valor existente na pilha (Entry) e outro campo é um apontador para o próximo elemento na pilha (NextNode) 4

810

10 8 4

Campo de dados(Entry)

Campo de ligação(NextNode)

Nó(StackNode)

Page 65: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

65

Implementação DinâmicaImplementação Dinâmica

Nós precisamos também armazenar o topo da pilha

4810

10 8 4

Campo de dados(Entry)

Campo de ligação(NextNode)

top

Um ponteiro armazenao topo da pilha Nó

(StackNode)

Page 66: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

66

QuestãoQuestão

Utilize estas idéias para escrever uma declaração de tipo que poderia implementar o tipo de dado pilha capaz de armazenar inteiros. A declaração deve ser um objeto com dois campos de dados Você tem 5 minutos

para escrever a declaração

Page 67: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

67

Uma SoluçãoUma Soluçãoclass Stack{ public:

Stack();void Push(int x);void Pop(int &x); ...

private:// declaração de tiposstruct StackNode{ int Entry; // tipo de dado colocado na pilha

StackNode *NextNode; // ligação para próximo// elemento na pilha

};typedef StackNode *StackPointer;

// declaração de camposStackPointer top; // Topo da pilha

};

Page 68: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

68

Uma SoluçãoUma Soluçãoclass Stack{ public:

Stack();void Push(int x);void Pop(int &x); ...

private:// declaração de tiposstruct StackNode{ int Entry; // tipo de dado colocado na pilha

StackNode *NextNode; // ligação para próximo// elemento na pilha

};typedef StackNode *StackPointer;

// declaração de camposStackPointer top; // Topo da pilha

};

Observe que o tipoStackEntry nesse caso éum inteiro

Page 69: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

69

Criação Criação

Stack::Stack()

A pilha deve iniciar vazia, ou seja,top está “aterrado”

Stack::Stack()

{

top = NULL;

}

top

Page 70: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

70

DestruiçãoDestruição

Stack::~Stack()

Usando alocação dinâmica a pilha, o destruidor deve retirar todos os elementos dapilha enquanto ela não estiver vazia. Lembre-se que atribuir NULL a top nãolibera o espaço alocado anteriormente!

Stack::~Stack()

{ int x;

while ( ! Empty() )

Pop(x);

}

8top

Page 71: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

71

Status: Status: EmptyEmpty

bool Stack::Empty()

Lembre-se que a pilha iniciavazia, com top = NULL...

bool Stack::Empty()

{

return (top == NULL);

}

top

Page 72: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

72

Status: Status: FullFull

bool Stack::Full()

...e que não há limite quanto ao númeromáximo de elementos da pilha

bool Stack::Full()

{

return false;

}

10 8top

Page 73: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

73

Operações Básicas: Operações Básicas: PushPush

Considere agora uma pilha vazia, o que significa top = NULL e adicione o primeiro nó. Assuma que esse nó já foi criado em algum lugar na memória e pode ser localizado usando uma variável p do tipo ponteiro (StackPointer)

void Stack::Push(int x)

top

Pilha Vazia

p

Pilha de tamanho 1

top

p8 8

Page 74: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

74

Operações Básicas: Operações Básicas: PushPush

Assim, colocando (Push) p na pilha consiste nas instruções:p->NextNode = top;...

void Stack::Push(int x)

top

Pilha de tamanho 1

top

pp

8 8

1010

Page 75: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

75

Operações Básicas: Operações Básicas: PushPush

Assim, colocando (Push) p na pilha consiste nas instruções:p->NextNode = top;top = p;

void Stack::Push(int x)

Pilha de tamanho 1

Pilha de tamanho 2

8 8

1010

top top

pp

Page 76: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

76

Operações Básicas: Operações Básicas: PushPush

Assim, colocando (Push) p na pilha consiste nas instruções:p->NextNode = top;top = p;

void Stack::Push(int x)

Pilha de tamanho 1

A ligação tracejada foi removidaAs ligações em negrito foram adicionadas

Pilha de tamanho 2

8 8

1010

top top

pp

Page 77: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

77

Operações Básicas: Operações Básicas: PushPush

void Stack::Push(int x)

void Stack::Push(int x){ StackPointer p;

p = new StackNode;...

}

Inicialmente, alocamos o novo nó,usando o ponteiro p

8top

p

Page 78: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

78

Operações Básicas: Operações Básicas: PushPush

void Stack::Push(int x)

void Stack::Push(int x){ StackPointer p;

p = new StackNode;if(p == NULL){ cout << “Memoria insuficiente”;abort();

}...

}

Inicialmente, alocamos o novo nó,usando o ponteiro p. Se não houverespaço na memória, escrevemos uma mensagem de erro e terminamos

8top

p

Page 79: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

79

Operações Básicas: Operações Básicas: PushPush

void Stack::Push(int x)

void Stack::Push(int x){ StackPointer p;

p = new StackNode;if(p == NULL){ cout << “Memoria insuficiente”;abort();

}

p->Entry = x; ...

}

Caso contrário, colocamos o elemento x no campo de dados de p

10

8top

p

Page 80: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

80

Operações Básicas: Operações Básicas: PushPush

void Stack::Push(int x)

void Stack::Push(int x){ StackPointer p;

p = new StackNode;if(p == NULL){ cout << “Memória insuficiente”;abort();

}

p->Entry = x; p->NextNode = top;...

}

Caso contrário, colocamos o elemento x no campo de dados de p e alteramos osponteiros

10

8top

p

Page 81: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

81

Operações Básicas: Operações Básicas: PushPush

void Stack::Push(int x)

void Stack::Push(int x){ StackPointer p;

p = new StackNode;if(p == NULL){ cout << “Memoria insuficiente”;abort();

}

p->Entry = x; p->NextNode = top;top = p;

}

Caso contrário, colocamos o elemento x no campo de dados de p e alteramos osponteiros

10

8top

p

Page 82: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

82

Operações Básicas: PopOperações Básicas: Pop

Para retirar um elemento da pilha...10 8 4top

Page 83: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

83

Operações Básicas: PopOperações Básicas: Pop

Para retirar um elemento da pilha...

...usamos um ponteiro auxiliar p

10 8 4top

p

10 8 4top

p = top;

Page 84: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

84

Operações Básicas: PopOperações Básicas: Pop

Para retirar um elemento da pilha...

...usamos um ponteiro auxiliar p

...alteramos top para o nó seguinte...

10 8 4top

p

10 8 4top

10 8 4top

p

p = top;

top = top->NextNode

Page 85: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

85

Operações Básicas: PopOperações Básicas: Pop

Para retirar um elemento da pilha...

...usamos um ponteiro auxiliar p

...alteramos top para o nó seguinte...

...e, finalmente, liberamos o espaço apontado por p

10 8 4top

p

10 8 4top

10 8 4top

p

8 4top

p

p = top;

top = top->NextNode

delete p;

Page 86: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

86

Operações Básicas: PopOperações Básicas: Pop

void Stack::Pop(int &x){ StackPointer p;

if (Empty()){ cout << “Pilha Vazia”;

abort();}...

}

void Stack::Pop(int &x)

Inicialmente, verificamos se a pilha está vazia. Em caso afirmativo, imprimimos uma mensagem de erro e terminamos

top

Pilha Vazia

Page 87: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

87

Operações Básicas: PopOperações Básicas: Pop

void Stack::Pop(int &x){ StackPointer p;

if (Empty()){ cout << “Pilha Vazia”;

abort();}

x = top->Entry; ...

}

void Stack::Pop(int &x)

Caso contrário, armazenamos o valor do topo na variável x

8x

8 4top

p

Page 88: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

88

Operações Básicas: PopOperações Básicas: Pop

void Stack::Pop(int &x){ StackPointer p;

if (Empty()){ cout << “Pilha Vazia”;

abort();}

x = top->Entry; p = top;...

}

void Stack::Pop(int &x)

Apontamos o ponteiro auxiliar p para o topo da pilha...

8x

8 4top

p

Page 89: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

89

Operações Básicas: PopOperações Básicas: Pop

void Stack::Pop(int &x){ StackPointer p;

if (Empty()){ cout << “Pilha Vazia”;

abort();}

x = top->Entry; p = top;top = top->NextNode;...

}

void Stack::Pop(int &x)

Apontamos o ponteiro auxiliar p para o topo da pilha; alteramos o topo para o próximo nó...

8x

8 4top

p

Page 90: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

90

Operações Básicas: PopOperações Básicas: Pop

void Stack::Pop(int &x){ StackPointer p;

if (Empty()){ cout << “Pilha Vazia”;

abort();}

x = top->Entry; p = top;top = top->NextNode;delete p;

}

void Stack::Pop(int &x)

Apontamos o ponteiro auxiliar p para o topo da pilha; alteramos o topo para o próximo nó e, finalmente, liberamos o espaço apontado por p (antigo topo)

8x

8

4top

p

Page 91: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

91

Operações Básicas: PopOperações Básicas: Pop

void Stack::Pop(int &x){ StackPointer p;

if (Empty()){ cout << “Pilha Vazia”;

abort();}

x = top->Entry; p = top;top = top->NextNode;delete p;

}

void Stack::Pop(int &x)

Apontamos o ponteiro auxiliar p para o topo da pilha; alteramos o topo para o próximo nó e, finalmente, liberamos o espaço apontado por p (antigo topo)

8x

4top

p

Page 92: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

92

Outras Operações: ExercíciosOutras Operações: Exercícios

Defina a operação Clear utilizando apenas as operações Empty e PopDefina a operação Clear utilizando diretamente ponteirosDefina a operação Top utilizando apenas Push e Pop e EmptyDefina a operação Top utilizando diretamente ponteirosDefina a operação Size

Há alguma ineficiência em sua implementação? Em caso afirmativo, estenda o objeto de forma a torná-la mais eficiente

Quais as vantagens e desvantagens de cada uma destas construções?

Page 93: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

93

Solução Solução ClearClear

Usando apenas Empty e Pop

void Stack::Clear(){ int x;

while(! Empty())Pop(x);

}

Utilizando campos do objeto

void Stack::Clear(){ StackPointer p;

while(top != NULL){ p = top;top = top->NextNode;delete p;

}}

Page 94: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

94

Solução Solução TopTop

Usando apenas Pushe Pop

void Stack::Top(int &x){ if(Empty())

{ cout << “Pilha vazia”;abort();

}Pop(x);Push(x);

}

Utilizando campos do objeto

void Stack::Top(int &x){ if(top == NULL)

{ cout << “Pilha vazia”;abort();

}x = top->Entry;

}

Page 95: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

95

Solução Solução SizeSize

int Stack::Size(){ StackPointer p;

int s=0;

p = top;while(p != NULL){ s++;p = p->NextNode;

}return s;

}

Page 96: Pilhas - dcm.ffclrp.usp.brdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Pilhas.pdf · pilha de pratos comumente encontrada em restaurantes do tipo self-service Os pratos são colocados

96

Nesta última parte, vimos uma forma de implementação de pilhas usando alocação dinâmicaA vantagem de usar alocação dinâmica (quando comparada com a implementação utilizando vetores) é que não é necessário definir o tamanho da pilha, evitando desperdício de espaçoUma desvantagem deste tipo de implementação é que, a cada chamada de Push e Pop, memória deve ser alocada/liberada, o que pode tornar essa implementação, em geral, um pouco mais lenta do que a pilha contígua

Pontos ImportantesPontos Importantes