Pilhas e Filas Sumrio Definio n Pilhas n

  • Slides: 114
Download presentation
Pilhas e Filas

Pilhas e Filas

Sumário Definição n Pilhas n Filas Implementação Java Implementação C++ 2

Sumário Definição n Pilhas n Filas Implementação Java Implementação C++ 2

Sumário Implementação Java n Fundamentos n Pilhas n Implementação por arrays n Implementação por

Sumário Implementação Java n Fundamentos n Pilhas n Implementação por arrays n Implementação por listas encadeadas n Filas n Implementação por arrays n Implementação por listas encadeadas Implementação C++ n Fundamentos n Pilhas n Implementação por arrays n Implementação por listas encadeadas n Filas n Implementação por arrays n Implementação por listas encadeadas 3

Definição

Definição

Pilhas

Pilhas

Conceito de Pilha (1) Pilha é o mais simples dos containers. A operação de

Conceito de Pilha (1) Pilha é o mais simples dos containers. A operação de inclusão de elementos na pilha recebe o nome de empilhamento (push) e a operação de exclusão recebe o nome de desempilhamento (pop) Um elemento empilhado vai ocupar a posição chamada de topo da pilha Uma operação de desempilhamento provoca a exclusão do elemento no topo da pilha. Por esta razão as pilhas são chamadas de listas LIFO ( de “Last In First Out’). Uma operação de desempilhamento em uma pilha vazia não tem sentido e configura uma situação denominada “underflow” Pode-se verificar se uma pilha atingir a condição de contorno de pilha vazia através da função is. Empty que pode assumir os valores TRUE (pilha vazia) ou FALSE (pilha não vazia) 6

Conceito de Pilha (2) Operações de empilhamento podem levar à situação na qual o

Conceito de Pilha (2) Operações de empilhamento podem levar à situação na qual o numero de elementos na pilha seja igual ao número máximo de elementos comportados pelo container Tentativas subseqüentes de empilhamento são impossíveis e configuram situação de transbordamento ou “overflow” A situação de “underflow” é lógica e impossível de ser contornada. Freqüentemente não constitui erro de algoritmo e sim teste de uma condição A situação de “overflow” é física e não lógica n Pode ser contornada aumentando o tamanho do container” hospedeiro n Contudo, durante o processamento configura um erro e deve interromper o processo 7

Conceito de Pilha (3) Uma operação adicional sobre pilhas é a verificação do elemento

Conceito de Pilha (3) Uma operação adicional sobre pilhas é a verificação do elemento no topo da pilha get. Top. Exemplos do dia a dia: n Pilhas de pratos n Pilhas de revistas 8

Conceito de Pilha (4) 9

Conceito de Pilha (4) 9

Filas

Filas

Conceito de Fila é um container no qual todas as inclusões são efetuadas em

Conceito de Fila é um container no qual todas as inclusões são efetuadas em uma extremidade chamada de retaguarda e todas as exclusões são efetuadas na outra extremidade denominada frente. Como nas filas o primeiro elemento a entrar é o primeiro a sair, as filas são chamadas de listas FIFO (de First-In, First-Out). Exemplos do dia a dia: n Filas de bancos n Filas de ônibus 11

Implementação por Arrays (1) A formulação espontânea contém dois ponteiros frente e retaguarda ou

Implementação por Arrays (1) A formulação espontânea contém dois ponteiros frente e retaguarda ou head e tail Inicia-se a fila com a condição de contorno head = 0 e tail = -1 Caracteriza-se fila vazia quando tail < head Fila cheia ocorre quando tail = array. length-1, onde array. length é o número máximo de elementos previstos no “array”. Como as listas podem “correr na memória” este esquema não é eficiente É mais vantajoso adotar filas circulares onde o primeiro elemento sucede o último e a implementação é feita por aritmética modular 12

Implementação por Arrays (2) O ajustamento de ponteiros por ocasião de inclusões e exclusões

Implementação por Arrays (2) O ajustamento de ponteiros por ocasião de inclusões e exclusões se torna diferente Inclusão: n tail (tail + 1) mod array. length ao invés de tail + 1 Exclusão: n head (head + 1 ) mod array. length ao invés de head + 1 A fila vazia seria caracterizada por head = tail e a fila cheia também, o que não é satisfatório Pode-se melhorar esta solução apontando head para a posição do “array” precedendo o primeiro elemento da fila. Esta será a opção adotada A condição de file cheia se torna head = = (tail + 1) mod array. length 13

Implementação por Arrays (3) A solução adotada pelo Framework de Bruno Preiss para as

Implementação por Arrays (3) A solução adotada pelo Framework de Bruno Preiss para as filas circulares é adotar a mesma condição de contorno tanto para fila cheia como para fila vazia head = tail A diferença entre um caso e outro é dada pelo contador count sendo count == array. length para fila cheia e count == 0 para fila vazia Esta solução permite a ocupação de todos os espaços do array enquanto a solução sem usar count (o conteúdo do container) exige que uma posição do array permaneça desocupada antes do início da fila 14

Exemplo de Fila 15

Exemplo de Fila 15

Filas circulares 16

Filas circulares 16

Hierarquia de Classes para implementação no Framework de Bruno Preiss

Hierarquia de Classes para implementação no Framework de Bruno Preiss

Java C++ 18

Java C++ 18

Implementação Java

Implementação Java

Hierarquia de Classes 20

Hierarquia de Classes 20

Fundamentos

Fundamentos

Interface Comparable public interface Comparable { boolean is. LT (Comparable object); boolean is. LE

Interface Comparable public interface Comparable { boolean is. LT (Comparable object); boolean is. LE (Comparable object); boolean is. GT (Comparable object); boolean is. GE (Comparable object); boolean is. EQ (Comparable object); boolean is. NE (Comparable object); int compare (Comparable object); } 22

Classe abstrata Abstract. Object (1) // pgm 05_02. java public abstract class Abstract. Object

Classe abstrata Abstract. Object (1) // pgm 05_02. java public abstract class Abstract. Object implements Comparable { public final boolean is. LT (Comparable object) { return compare (object) < 0; } public final boolean is. LE (Comparable object) { return compare (object) <= 0; } public final boolean is. GT (Comparable object) { return compare (object) > 0; } public final boolean is. GE (Comparable object) { return compare (object) >= 0; } public final boolean is. EQ (Comparable object) { return compare (object) == 0; } public final boolean is. NE (Comparable object) { return compare (object) != 0; } 23

Classe abstrata Abstract. Object (2) public final boolean equals (Object object) { if(object instanceof

Classe abstrata Abstract. Object (2) public final boolean equals (Object object) { if(object instanceof Comparable) return is. EQ ((Comparable) object); else return false; } public final int compare (Comparable arg) { if(get. Class () == arg. get. Class()) return compare. To (arg); else return get. Class(). get. Name(). compare. To( arg. get. Class(). get. Name() ); } protected abstract int compare. To (Comparable arg); } 24

Interface Container public interface Container extends Comparable { int get. Count (); boolean is.

Interface Container public interface Container extends Comparable { int get. Count (); boolean is. Empty (); boolean is. Full (); void purge (); void accept (Visitor visitor); Enumeration get. Enumeration (); } 25

Classe Abstrata Abstract. Container public abstract class Abstract. Container extends Abstract. Object implements Container

Classe Abstrata Abstract. Container public abstract class Abstract. Container extends Abstract. Object implements Container { protected int count; public int get. Count () { return count; } public boolean is. Empty () { return get. Count () == 0; } public boolean is. Full () { return false; } //. . . } 26

Interface Stack // pgm 06_01. java public interface Stack extends Container { Object get.

Interface Stack // pgm 06_01. java public interface Stack extends Container { Object get. Top (); void push (Object object); Object pop (); } 27

Interface Queue // pgm 06_13. java public interface Queue extends Container { Object get.

Interface Queue // pgm 06_13. java public interface Queue extends Container { Object get. Head (); void enqueue (Object object); Object dequeue (); } 28

Pilhas

Pilhas

Pilhas Implementadas em Java Utilizando Arrays

Pilhas Implementadas em Java Utilizando Arrays

Definição da Classe Stack. As. Array // pgm 06_02. txt public class Stack. As.

Definição da Classe Stack. As. Array // pgm 06_02. txt public class Stack. As. Array extends Abstract. Container implements Stack { protected Object[] array; //. . . } 31

Métodos Construtor e purge da Classe Stack. As. Array // pgm 06_03. java public

Métodos Construtor e purge da Classe Stack. As. Array // pgm 06_03. java public class Stack. As. Array extends Abstract. Container implements Stack { protected Object[] array; public Stack. As. Array (int size) { array = new Object [size]; } public void purge () { while (count > 0) array [--count] = null; } //. . . } 32

Métodos push, pop e get. Top da Classe Stack. As. Array (1) // pgm

Métodos push, pop e get. Top da Classe Stack. As. Array (1) // pgm 06_04. java public class Stack. As. Array extends Abstract. Container implements Stack { protected Object[] array; public void push (Object object) { if(count == array. length) throw new Container. Full. Exception(); array [count++] = object; } 33

Métodos push, pop e get. Top da Classe Stack. As. Array (2) // pgm

Métodos push, pop e get. Top da Classe Stack. As. Array (2) // pgm 06_04. java (Continuação) public Object pop () { if(count == 0) throw new Container. Empty. Exception(); Object result = array [--count]; array[count] = null; return result; } public Object get. Top () { if(count == 0) throw new Container. Empty. Exception (); return array [count - 1]; } //. . . } 34

Método accept da Classe Stack. As. Array // pgm 06_05. java public class Stack.

Método accept da Classe Stack. As. Array // pgm 06_05. java public class Stack. As. Array extends Abstract. Container implements Stack { protected Object[] array; public void accept (Visitor visitor) { for (int i = 0; i < count; ++i) { visitor. visit (array [i]); if(visitor. is. Done ()) return; } } //. . . } 35

Exemplo de uso de Enumeração (1) Considere-se o código que se segue Stack stack

Exemplo de uso de Enumeração (1) Considere-se o código que se segue Stack stack = new Stack. As. Array (57); stack. push (new Integer (3)); stack. push (new Integer (1)); stack. push (new Integer (4)); Enumeration e = stack. get. Enumeration (); while (e. has. More. Elements ()) { Object obj = e. next. Element (); System. out. println (obj); } 36

Exemplo de uso de Enumeração (2) Este código cria uma instância da classe Stack.

Exemplo de uso de Enumeração (2) Este código cria uma instância da classe Stack. As. Array e a atribui à variável stack. Diversos objetos do tipo Integer são empilhados. Finalmente uma enumeração é usada para imprimir de maneira sistemática todos os objetos na pilha. 37

Classes interiores Uma classe interior é uma classe definida dentro de outra. A menos

Classes interiores Uma classe interior é uma classe definida dentro de outra. A menos que seja declarada estática, cada instância de uma classe interior é suposta dentro de uma instância da classe exterior sendo as classes interiores não estáticas por default. Instâncias de classes interiores podem invocar métodos de instâncias da classe exterior e ter acesso a seus membros. Pode haver mais de uma instância de classe interior para uma instância de classe exterior. Uma classe anônima é uma classe sem nome. Estas classes são criadas estendendo uma classe existente ou implementando uma interface bem no ponto do código aonde a classe está sendo instanciada. 38

Método get. Enumeration da Classe Stack. As. Array // pgm 06_06. java public class

Método get. Enumeration da Classe Stack. As. Array // pgm 06_06. java public class Stack. As. Array extends Abstract. Container implements Stack { protected Object[] array; public Enumeration get. Enumeration() { return new Enumeration() { protected int position = 0; public boolean has. More. Elements() { return position < get. Count (); } public Object next. Element() { if(position >= get. Count ()) throw new No. Such. Element. Exception(); return array [position++]; } }; } 39 }

Pilhas Implementadas em Java Utilizando Listas Encadeadas

Pilhas Implementadas em Java Utilizando Listas Encadeadas

Definição da Classe Stack. As. Linked. List // pgm 06_07. java public class Stack.

Definição da Classe Stack. As. Linked. List // pgm 06_07. java public class Stack. As. Linked. List extends Abstract. Container implements Stack { protected Linked. List list; //. . . } 41

Métodos Construtor e purge da Classe Stack. As. Linked. List // pgm 06_08. java

Métodos Construtor e purge da Classe Stack. As. Linked. List // pgm 06_08. java public class Stack. As. Linked. List extends Abstract. Container implements Stack { protected Linked. List list; public Stack. As. Linked. List () { list = new Linked. List (); } public void purge () { list. purge (); count = 0; } //. . . } 42

Métodos push, pop e get. Top da Classe Stack. As. Linked. List (1) //

Métodos push, pop e get. Top da Classe Stack. As. Linked. List (1) // pgm 06_09. java public class Stack. As. Linked. List extends Abstract. Container implements Stack { protected Linked. List list; public void push (Object object) { list. prepend (object); ++count; } 43

Métodos push, pop e get. Top da Classe Stack. As. Linked. List (2) //

Métodos push, pop e get. Top da Classe Stack. As. Linked. List (2) // pgm 06_09. java (Continuação) public Object pop () { if(count == 0) throw new Container. Empty. Exception (); Object result = list. get. First (); list. extract (result); --count; return result; } public Object get. Top () { if(count == 0) throw new Container. Empty. Exception (); return list. get. First (); } //. . . } 44

Método accept da Classe Stack. As. Linked. List // pgm 06_10. java public class

Método accept da Classe Stack. As. Linked. List // pgm 06_10. java public class Stack. As. Linked. List extends Abstract. Container implements Stack { protected Linked. List list; public void accept (Visitor visitor) { for(Linked. List. Element ptr = list. get. Head (); ptr != null; ptr = ptr. get. Next ()) { visitor. visit (ptr. get. Datum ()); if(visitor. is. Done ()) return; } } //. . . } 45

Método get. Enumeration da Classe Stack. As. Linked. List (1) // pgm 06_11. java

Método get. Enumeration da Classe Stack. As. Linked. List (1) // pgm 06_11. java public class Stack. As. Linked. List extends Abstract. Container implements Stack { protected Linked. List list; 46

Método get. Enumeration da Classe Stack. As. Linked. List (1) // pgm 06_11. java

Método get. Enumeration da Classe Stack. As. Linked. List (1) // pgm 06_11. java (Continuação) public Enumeration get. Enumeration () { return new Enumeration () { protected Linked. List. Element position =list. get. Head(); public boolean has. More. Elements () { return position != null; } public Object next. Element () { if(position == null) throw new No. Such. Element. Exception (); Object result = position. get. Datum (); position = position. get. Next (); return result; } }; } //. . . } 47

Filas

Filas

Filas Implementadas em Java Utilizando Arrays

Filas Implementadas em Java Utilizando Arrays

Definição da Classe Queue. As. Array // pgm 06_14. java public class Queue. As.

Definição da Classe Queue. As. Array // pgm 06_14. java public class Queue. As. Array extends Abstract. Container implements Queue { protected Object[] array; protected int head; protected int tail; //. . . } 50

Métodos construtor e purge da Classe Queue. As. Array (1) // pgm 06_15. java

Métodos construtor e purge da Classe Queue. As. Array (1) // pgm 06_15. java public class Queue. As. Array extends Abstract. Container implements Queue { protected Object[] array; protected int head; protected int tail; public Queue. As. Array (int size) { array = new Object [size]; head = 0; tail = size - 1; } 51

Métodos construtor e purge da Classe Queue. As. Array (2) // pgm 06_15. java

Métodos construtor e purge da Classe Queue. As. Array (2) // pgm 06_15. java (Continuação) public void purge () { while (count > 0) { array [head] = null; if (++head == array. length) head = 0; --count; } } //. . . } 52

Métodos get. Head, enqueue e dequeue da Classe Queue. As. Array (1) // pgm

Métodos get. Head, enqueue e dequeue da Classe Queue. As. Array (1) // pgm 06_16. java public class Queue. As. Array extends Abstract. Container implements Queue { protected Object[] array; protected int head; protected int tail; public Object get. Head () { if(count == 0) throw new Container. Empty. Exception (); return array [head]; } 53

Métodos get. Head, enqueue e dequeue da Classe Queue. As. Array (2) public void

Métodos get. Head, enqueue e dequeue da Classe Queue. As. Array (2) public void enqueue (Object object) { if(count == array. length) throw new Container. Full. Exception (); if(++tail == array. length) tail = 0; array [tail] = object; ++count; } public Object dequeue () { if(count == 0) throw new Container. Empty. Exception (); Object result = array [head]; array [head] = null; if(++head == array. length) head = 0; --count; return result; } //. . . } 54

Filas Implementadas em Java Utilizando Listas Encadeadas

Filas Implementadas em Java Utilizando Listas Encadeadas

Definição da Classe Queue. As. Linked. List // pgm 06_17. java public class Queue.

Definição da Classe Queue. As. Linked. List // pgm 06_17. java public class Queue. As. Linked. List extends Abstract. Container implements Queue { protected Linked. List list; //. . . } 56

Métodos construtor e purge da Classe Queue. As. Linked. List // pgm 06_18. java

Métodos construtor e purge da Classe Queue. As. Linked. List // pgm 06_18. java public class Queue. As. Linked. List extends Abstract. Container implements Queue { protected Linked. List list; public Queue. As. Linked. List () { list = new Linked. List (); } public void purge () { list. purge (); count = 0; } //. . . } 57

Métodos get. Head, enqueue e dequeue da Classe Queue. As. Linked. List (1) //

Métodos get. Head, enqueue e dequeue da Classe Queue. As. Linked. List (1) // pgm 06_19. java public class Queue. As. Linked. List extends Abstract. Container implements Queue { protected Linked. List list; public Object get. Head () { if(count == 0) throw new Container. Empty. Exception (); return list. get. First (); } 58

Métodos get. Head, enqueue e dequeue da Classe Queue. As. Linked. List (2) //

Métodos get. Head, enqueue e dequeue da Classe Queue. As. Linked. List (2) // pgm 06_19. java (Continuação) public void enqueue (Object object) { list. append (object); ++count; } public Object dequeue () { if(count == 0) throw new Container. Empty. Exception (); Object result = list. get. First (); list. extract(result); --count; return result; } //. . . } 59

Implementação C++

Implementação C++

Hierarquia de Classes 61

Hierarquia de Classes 61

Fundamentos

Fundamentos

Definição da Classe Object // pgm 05_01. cpp class Object { protected: virtual int

Definição da Classe Object // pgm 05_01. cpp class Object { protected: virtual int Compare. To (Object const&) const = 0; public: virtual ~Object (); virtual bool Is. Null () const; virtual int Compare (Object const&) const; virtual Hash. Value Hash () const = 0; virtual void Put (ostream&) const = 0; }; 63

Operadores da Classe Object // pgm 05_02. cpp inline bool operator == (Object const&

Operadores da Classe Object // pgm 05_02. cpp inline bool operator == (Object const& left, Object const& right) { return left. Compare (right) == 0; } inline bool operator != (Object const& left, Object const& right) { return left. Compare (right) != 0; } inline bool operator <= (Object const& left, Object const& right) { return left. Compare (right) <= 0; } inline bool operator < (Object const& left, Object const& right) { return left. Compare (right) < 0; } inline bool operator >= (Object const& left, Object const& right) { return left. Compare (right) >= 0; } inline bool operator > (Object const& left, Object const& right) { return left. Compare (right) > 0; } inline ostream& operator << (ostream& s, Object const& object) { object. Put (s); return s; } 64

Funções membro da Classe Object // pgm 05_03. cpp #include <typeinfo> Object: : ~Object

Funções membro da Classe Object // pgm 05_03. cpp #include <typeinfo> Object: : ~Object () {} bool Object: : Is. Null () const { return false; } int Object: : Compare (Object const& object) const { if(typeid (*this) == typeid (object)) return Compare. To (object); else if(typeid (*this). before (typeid (object))) return -1; else return 1; } 65

Definição da Classe Null. Object //pgm 05_04. cpp class Null. Object : public Object

Definição da Classe Null. Object //pgm 05_04. cpp class Null. Object : public Object { static Null. Object instance; Null. Object (); protected: int Compare. To (Object const&) const; public: bool Is. Null () const; Hash. Value Hash () const; void Put (ostream& s) const; static Null. Object& Instance (); }; 66

Funções membro da Classe Null. Object //pgm 05_05. cpp Null. Object: : instance; Null.

Funções membro da Classe Null. Object //pgm 05_05. cpp Null. Object: : instance; Null. Object: : Null. Object () {} bool Null. Object: : Is. Null () const { return true; } int Null. Object: : Compare. To (Object const&) const { return 0; } Hash. Value Null. Object: : Hash () const { return 0; } void Null. Object: : Put (ostream& s) const { s << "Null. Object"; } Null. Object& Null. Object: : Instance () { return instance; } 67

Definição da Classe Wrapper<T> //pgm 05_06. cpp template <class T> class Wrapper : public

Definição da Classe Wrapper<T> //pgm 05_06. cpp template <class T> class Wrapper : public Object { protected: T datum; int Compare. To (Object const&) const; public: Wrapper (); Wrapper (T const&); Wrapper& operator = (T const&); operator T const& () const; Hash. Value Hash() const; void Put(ostream&) const; }; 68

Funções membro da Classe Wrapper<T> (1) //pgm 05_07. cpp template <class T> Wrapper<T>: :

Funções membro da Classe Wrapper<T> (1) //pgm 05_07. cpp template <class T> Wrapper<T>: : Wrapper () : datum () {} template <class T> Wrapper<T>: : Wrapper (T const& d) : datum (d) {} template <class T> Wrapper<T>& Wrapper<T>: : operator = (T const& d) { datum = d; return *this; } 69

Funções membro da Classe Wrapper<T> (2) //pgm 05_07. cpp (Continuação) template <class T> Wrapper<T>:

Funções membro da Classe Wrapper<T> (2) //pgm 05_07. cpp (Continuação) template <class T> Wrapper<T>: : operator T const& () const { return datum; } template <class T> int Wrapper<T>: : Compare. To (Object const& obj) const { Wrapper<T> const& arg = dynamic_cast<Wrapper<T> const&> (obj); return : : Compare (datum, arg. datum); } template <class T> void Wrapper<T>: : Put (ostream& s) const { s << datum; } 70

Definição da Classe Container // pgm 05_09. cpp class Container : public virtual Object,

Definição da Classe Container // pgm 05_09. cpp class Container : public virtual Object, public virtual Ownership { protected: unsigned int count; Container (); public: virtual unsigned int Count () const; virtual bool Is. Empty () const; virtual bool Is. Full () const; virtual Hash. Value Hash () const; virtual void Put (ostream&) const; virtual Iterator& New. Iterator () const; virtual void Purge () = 0; virtual void Accept (Visitor&) const = 0; 71 };

Funções membro da Classe Container //pgm 05_10. cpp Container: : Container () : count

Funções membro da Classe Container //pgm 05_10. cpp Container: : Container () : count (0) {} unsigned int Container: : Count () const { return count; } bool Container: : Is. Empty () const { return Count () == 0; } bool Container: : Is. Full () const { return false; } 72

Definição da Classe Visitor //pgm 05_11. cpp class Visitor { public: virtual void Visit

Definição da Classe Visitor //pgm 05_11. cpp class Visitor { public: virtual void Visit (Object&) = 0; virtual bool Is. Done () const { return false; } }; 73

Função Put da Classe Container (1) //pgm 05_12. cpp #include <typeinfo> class Putting. Visitor

Função Put da Classe Container (1) //pgm 05_12. cpp #include <typeinfo> class Putting. Visitor : public Visitor { ostream& stream; bool comma; public: Putting. Visitor (ostream& s) : stream (s), comma (false) {} void Visit (Object& object) { if (comma) stream << ", "; stream << object; comma = true; } 74 };

Função Put da Classe Container (2) // pgm 05_12. cpp (Conyinuação) void Container: :

Função Put da Classe Container (2) // pgm 05_12. cpp (Conyinuação) void Container: : Put (ostream& s) const { Putting. Visitor visitor (s); s << typeid (*this). name () << " {"; Accept (visitor); s << "}"; } 75

Definição da Classe Iterator //pgm 05_13. cpp class Iterator { public: virtual ~Iterator ();

Definição da Classe Iterator //pgm 05_13. cpp class Iterator { public: virtual ~Iterator (); virtual void Reset () = 0; virtual bool Is. Done () const = 0; virtual Object& operator * () const = 0; virtual void operator ++ () = 0; }; 76

Funções membro da Classe Iterator& Some. Container: : New. Iterator () const { return

Funções membro da Classe Iterator& Some. Container: : New. Iterator () const { return *new Some. Iterator (*this); } Some. Container c; Iterator& i = c. New. Iterator (); while (!i. Is. Done ()) { cout << *i << endl; ++i; } delete &i; 77

Definição da Classe Null. Iterator //pgm 05_14. cpp class Null. Iterator : public Iterator

Definição da Classe Null. Iterator //pgm 05_14. cpp class Null. Iterator : public Iterator { public: Null. Iterator (); void Reset (); bool Is. Done () const; Object& operator * () const; void operator ++ (); }; 78

Funções membro da Classe Null. Iterator //pgm 05_15. cpp Null. Iterator: : Null. Iterator

Funções membro da Classe Null. Iterator //pgm 05_15. cpp Null. Iterator: : Null. Iterator () {} void Null. Iterator: : Reset () {} bool Null. Iterator: : Is. Done () const { return true; } Object& Null. Iterator: : operator * () const { return Null. Object: : Instance (); } void Null. Iterator: : operator ++ () {} // pgm 05_16. cpp Iterator& Container: : New. Iterator () const { return *new Null. Iterator (); } 79

Definição da Classe Stack // pgm 06_01. cpp class Stack : public virtual Container

Definição da Classe Stack // pgm 06_01. cpp class Stack : public virtual Container { public: virtual Object& Top () const = 0; virtual void Push (Object&) = 0; virtual Object& Pop () = 0; }; 80

Pilhas

Pilhas

Pilhas Implementadas em C++ Utilizando Arrays

Pilhas Implementadas em C++ Utilizando Arrays

Definição da Classe Stack // pgm 06_01. cpp class Stack : public virtual Container

Definição da Classe Stack // pgm 06_01. cpp class Stack : public virtual Container { public: virtual Object& Top () const = 0; virtual void Push (Object&) = 0; virtual Object& Pop () = 0; }; 83

Definição da Classe Stack. As. Array A variável array é declarada instanciando o template

Definição da Classe Stack. As. Array A variável array é declarada instanciando o template da classe Array<T> com T=Object*, ou seja, um array de ponteiros para Object O uso de ponteiros é consistente com a implementação de containers por armazenamento indireto 84

Definição da Classe Stack. As. Array // pgm 06_02. cpp class Stack. As. Array

Definição da Classe Stack. As. Array // pgm 06_02. cpp class Stack. As. Array : public Stack { Array<Object*> array; class Iter; public: Stack. As. Array (unsigned int); //. . . friend class Iter; }; class Stack. As. Array: : Iter : public Iterator { Stack. As. Array const& stack; unsigned int position; public: Iter (Stack. As. Array const&); //. . . }; 85

Funções membro Construtor, Destrutor e Purge da Classe Stack. As. Array // pgm 06_03.

Funções membro Construtor, Destrutor e Purge da Classe Stack. As. Array // pgm 06_03. cpp Stack. As. Array: : Stack. As. Array (unsigned int size) : array(size) {} void Stack. As. Array: : Purge () { if(Is. Owner ()) { for(unsigned int i = 0; i < count; ++i) delete array [i]; } count = 0; } Stack. As. Array: : ~Stack. As. Array () { Purge (); } 86

Funções membro Push, Pop e Top da Classe Stack. As. Array // pgm 06_04.

Funções membro Push, Pop e Top da Classe Stack. As. Array // pgm 06_04. cpp void Stack. As. Array: : Push (Object& object) { if(count == array. Length ()) throw domain_error ("stack is full"); array [count++] = &object; } Object& Stack. As. Array: : Pop (){ if(count == 0) throw domain_error ("stack is empty"); return *array [--count]; } Object& Stack. As. Array: : Top () const{ if(count == 0) throw domain_error ("stack is empty"); return *array [count - 1 U]; } 87

Função membro Accept da Classe Stack. As. Array // pgm 06_05. cpp void Stack.

Função membro Accept da Classe Stack. As. Array // pgm 06_05. cpp void Stack. As. Array: : Accept (Visitor& visitor) const { for(unsigned int i = 0; i < count && !visitor. Is. Done(); ++i) { visitor. Visit (*array [i]); } } 88

Funções membro da Classe Stack. As. Array: : Iter Na definição da classe Stack.

Funções membro da Classe Stack. As. Array: : Iter Na definição da classe Stack. As. Array foi definida uma classe embutida Iter A classe Stack. As. Array: : Iter é uma classe friend da classe Stack. As. Array tendo acesso às variáveis membro e funções privados daquela classe A implementação do iterator depende da implementação do container 89

Funções membro da Classe Stack. As. Array: : Iter (1) // pgm 06_06. cpp

Funções membro da Classe Stack. As. Array: : Iter (1) // pgm 06_06. cpp Stack. As. Array: : Iter (Stack. As. Array const& _stack) : stack (_stack) { Reset (); } bool Stack. As. Array: : Iter: : Is. Done () const { return position >= stack. count; } Object& Stack. As. Array: : Iter: : operator * () const { if(position < stack. count) return *stack. array [position]; else return Null. Object: : Instance (); } 90

Funções membro da Classe Stack. As. Array: : Iter (2) // pgm 06_06. cpp

Funções membro da Classe Stack. As. Array: : Iter (2) // pgm 06_06. cpp (ContinuaçÃo) void Stack. As. Array: : Iter: : operator ++ () { if(position < stack. count) ++position; } void Stack. As. Array: : Iter: : Reset () { position = 0; } 91

Exemplo de uso de Iterator Considere-se o código que se segue Stack. As. Array

Exemplo de uso de Iterator Considere-se o código que se segue Stack. As. Array stack; stack. Push (*new Int (3)); stack. Push (*new Int (1)); stack. Push (*new Int (4)); Iterator& i = stack. New. Iterator (); while (!i. Is. Done ()) { cout << *i << endl; ++i; } delete &i; 92

Exemplo de uso de Iterator Este código declara uma variável stack Diversos objetos do

Exemplo de uso de Iterator Este código declara uma variável stack Diversos objetos do tipo Integer são empilhados. Finalmente um Iterator é usado para imprimir de maneira sistemática todos os objetos na pilha. 93

Pilhas Implementadas em C++ Utilizando Listas Encadeadas

Pilhas Implementadas em C++ Utilizando Listas Encadeadas

Definição da Classe Stack. As. Linked. List // pgm 06_07. cpp class Stack. As.

Definição da Classe Stack. As. Linked. List // pgm 06_07. cpp class Stack. As. Linked. List : public Stack { Linked. List<Object*> list; class Iter; public: Stack. As. Linked. List (); //. . . friend class Iter; }; class Stack. As. Linked. List: : Iter : public Iterator { Stack. As. Linked. List const& stack; List. Element<Object*> const* position; public: Iter (Stack. As. Linked. List const&); //. . . }; 95

Funções membro Construtor, Destrutor e Purge da Classe Stack. As. Linked. List // pgm

Funções membro Construtor, Destrutor e Purge da Classe Stack. As. Linked. List // pgm 06_08. cpp Stack. As. Linked. List: : Stack. As. Linked. List () : list () {} void Stack. As. Linked. List: : Purge () { if(Is. Owner()) { List. Element<Object*> const* ptr; for (ptr = list. Head (); ptr != 0; ptr = ptr->Next ()) delete ptr->Datum (); } list. Purge (); count = 0; } Stack. As. Linked. List: : ~Stack. As. Linked. List () 96 { Purge (); }

Funções membro Push, Pop e Top da Classe Stack. As. Linked. List (1) //

Funções membro Push, Pop e Top da Classe Stack. As. Linked. List (1) // pgm 06_09. cpp void Stack. As. Linked. List: : Push (Object& object) { list. Prepend (&object); ++count; } Object& Stack. As. Linked. List: : Pop () { if(count == 0) throw domain_error ("stack is empty"); Object& const result = *list. First (); list. Extract (&result); --count; return result; } 97

Funções membro Push, Pop e Top da Classe Stack. As. Linked. List (2) //

Funções membro Push, Pop e Top da Classe Stack. As. Linked. List (2) // pgm 06_09. cpp (Continuação) Object& Stack. As. Linked. List: : Top () const { if(count == 0) throw domain_error ("stack is empty"); return *list. First (); } 98

Função membro Accept da Classe Stack. As. Linked. List // pgm 06_10. cpp void

Função membro Accept da Classe Stack. As. Linked. List // pgm 06_10. cpp void Stack. As. Linked. List: : Accept (Visitor& visitor) const { List. Element<Object*> const* ptr; for(ptr = list. Head (); ptr != 0 && !visitor. Is. Done (); ptr = ptr->Next ()) { visitor. Visit (*ptr->Datum ()); } } 99

Funções membro da Classe Stack. As. Linked. List: : Iter (1) // pgm 06_11.

Funções membro da Classe Stack. As. Linked. List: : Iter (1) // pgm 06_11. cpp Stack. As. Linked. List: : Iter ( Stack. As. Linked. List const& _stack) : stack (_stack) { Reset (); } bool Stack. As. Linked. List: : Iter: : Is. Done () const { return position == 0; } Object& Stack. As. Linked. List: : Iter: : operator * () const { if(position != 0) return *position->Datum (); else return Null. Object: : Instance (); } 100

Funções membro da Classe Stack. As. Linked. List: : Iter (2) // pgm 06_11.

Funções membro da Classe Stack. As. Linked. List: : Iter (2) // pgm 06_11. cpp (Continuação) void Stack. As. Linked. List: : Iter: : operator ++ () { if(position != 0) position = position->Next (); } void Stack. As. Linked. List: : Iter: : Reset () { position = stack. list. Head (); } 101

Filas

Filas

Filas Implementadas em C++ Utilizando Arrays

Filas Implementadas em C++ Utilizando Arrays

Definição da Classe Queue // pgm 06_13. cpp class Queue : public virtual Container

Definição da Classe Queue // pgm 06_13. cpp class Queue : public virtual Container { public: virtual Object& Head () const = 0; virtual void Enqueue (Object&) = 0; virtual Object& Dequeue () = 0; }; 104

Definição da Classe Queue. As. Array // pgm 06_14. cpp class Queue. As. Array

Definição da Classe Queue. As. Array // pgm 06_14. cpp class Queue. As. Array : public virtual Queue { protected: Array<Object*> array; unsigned int head; unsigned int tail; public: Queue. As. Array (unsigned int); ~Queue. As. Array (); //. . . }; 105

Funções membro Construtor, Destrutor e Purge da Classe Queue. As. Array (1) // pgm

Funções membro Construtor, Destrutor e Purge da Classe Queue. As. Array (1) // pgm 06_15. cpp Queue. As. Array: : Queue. As. Array (unsigned int size) : array (size), head (0), tail (size - 1 U) {} 106

Funções membro Construtor, Destrutor e Purge da Classe Queue. As. Array (2) // pgm

Funções membro Construtor, Destrutor e Purge da Classe Queue. As. Array (2) // pgm 06_15. cpp (Continuação) void Queue. As. Array: : Purge () { if(Is. Owner ()) { for(unsigned int i = 0; i < count; ++i) { delete array [head]; if(++head == array. Length ()) head = 0; } } count = 0; } Queue. As. Array: : ~Queue. As. Array () { Purge (); } 107

Funções membro Head, Enqueue e Dequeue da Classe Queue. As. Array (1) // pgm

Funções membro Head, Enqueue e Dequeue da Classe Queue. As. Array (1) // pgm 06_16. cpp Object& Queue. As. Array: : Head () const { if(count == 0) throw domain_error ("queue is empty"); return *array [head]; } void Queue. As. Array: : Enqueue (Object& object) { if(count == array. Length ()) throw domain_error ("queue is full"); if(++tail == array. Length ()) tail = 0; array [tail] = &object; ++count; } 108

Funções membro Head, Enqueue e Dequeue da Classe Queue. As. Array (2) // pgm

Funções membro Head, Enqueue e Dequeue da Classe Queue. As. Array (2) // pgm 06_16. cpp (Continuação) Object& Queue. As. Array: : Dequeue () { if (count == 0) throw domain_error ("queue is empty"); Object& result = *array [head]; if (++head == array. Length ()) head = 0; --count; return result; } 109

Filas Implementadas em C++ Utilizando Listas Encadeadas

Filas Implementadas em C++ Utilizando Listas Encadeadas

Definição da Classe Queue. As. Linked. List // pgm 06_17. cpp class Queue. As.

Definição da Classe Queue. As. Linked. List // pgm 06_17. cpp class Queue. As. Linked. List : public virtual Queue { protected: Linked. List<Object*> list; public: Queue. As. Linked. List (); ~Queue. As. Linked. List (); //. . . }; 111

Funções membro Construtor, Destrutor e Purge da Classe Queue. As. Linked. List // pgm

Funções membro Construtor, Destrutor e Purge da Classe Queue. As. Linked. List // pgm 06_18. cpp Queue. As. Linked. List: : Queue. As. Linked. List () : list () {} void Queue. As. Linked. List: : Purge () { if(Is. Owner ()) { List. Element<Object*> const* ptr; for(ptr = list. Head (); ptr != 0; ptr = ptr->Next ()) delete ptr->Datum (); } list. Purge (); count = 0; } Queue. As. Linked. List: : ~Queue. As. Linked. List () { Purge (); } 112

Funções membro Head, Enqueue e Dequeue da Classe Queue. As. Linked. List (1) //

Funções membro Head, Enqueue e Dequeue da Classe Queue. As. Linked. List (1) // pgm 06_19. cpp Object& Queue. As. Linked. List: : Head () const { if (count == 0) throw domain_error ("queue is empty"); return *list. First (); } void Queue. As. Linked. List: : Enqueue (Object& object) { list. Append (&object); ++count; } 113

Funções membro Head, Enqueue e Dequeue da Classe Queue. As. Linked. List (2) //

Funções membro Head, Enqueue e Dequeue da Classe Queue. As. Linked. List (2) // pgm 06_19. cpp (Continuação) Object& Queue. As. Linked. List: : Dequeue () { if(count == 0) throw domain_error ("queue is empty"); Object& result = *list. First (); list. Extract (&result); --count; return result; } 114