pilhas e filas

114
Pilhas e Filas

Upload: anoki

Post on 21-Mar-2016

31 views

Category:

Documents


1 download

DESCRIPTION

Pilhas e Filas. Sumário. Definição Pilhas Filas Implementação Java Implementação C++. Sumário. Implementação Java Fundamentos Pilhas Implementação por arrays Implementação por listas encadeadas Filas Implementação por arrays Implementação por listas encadeadas Implementação C++ - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Pilhas e Filas

Pilhas e Filas

Page 2: Pilhas e Filas

2

Sumário

Definição Pilhas Filas

Implementação JavaImplementação C++

Page 3: Pilhas e Filas

3

SumárioImplementação Java Fundamentos Pilhas

Implementação por arrays Implementação por listas encadeadas

Filas Implementação por arrays Implementação por listas encadeadas

Implementação C++ Fundamentos Pilhas

Implementação por arrays Implementação por listas encadeadas

Filas Implementação por arrays Implementação por listas encadeadas

Page 4: Pilhas e Filas

Definição

Page 5: Pilhas e Filas

Pilhas

Page 6: Pilhas e Filas

6

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 pilhaUma 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 isEmpty que pode assumir os valores TRUE (pilha vazia) ou FALSE (pilha não vazia)

Page 7: Pilhas e Filas

7

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 containerTentativas 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çãoA situação de “overflow” é física e não lógica Pode ser contornada aumentando o tamanho do

container” hospedeiro Contudo, durante o processamento configura um erro e

deve interromper o processo

Page 8: Pilhas e Filas

8

Conceito de Pilha (3)

Uma operação adicional sobre pilhas é a verificação do elemento no topo da pilha getTop.Exemplos do dia a dia: Pilhas de pratos Pilhas de revistas

Page 9: Pilhas e Filas

9

Conceito de Pilha (4)

Page 10: Pilhas e Filas

Filas

Page 11: Pilhas e Filas

11

Conceito de FilaFila é 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: Filas de bancos Filas de ônibus

Page 12: Pilhas e Filas

12

Implementação por Arrays (1)A formulação espontânea contém dois ponteiros frente e retaguarda ou head e tailInicia-se a fila com a condição de contorno head = 0 e tail = -1Caracteriza-se fila vazia quando tail < headFila 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

Page 13: Pilhas e Filas

13

Implementação por Arrays (2)O ajustamento de ponteiros por ocasião de inclusões e exclusões se torna diferente Inclusão: tail (tail + 1) mod array.length ao invés de tail tail + 1

Exclusão: head (head + 1 ) mod array.length ao invés de head head + 1

A fila vazia seria caracterizada por head = tail e a fila cheia também, o que não é satisfatórioPode-se melhorar esta solução apontando head para a posição do “array” precedendo o primeiro elemento da fila. Esta será a opção adotadaA condição de file cheia se torna

head = = (tail + 1) mod array.length

Page 14: Pilhas e Filas

14

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 = tailA diferença entre um caso e outro é dada pelo contador count sendo count == array.length para fila cheia e

count == 0 para fila vaziaEsta 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

Page 15: Pilhas e Filas

15

Exemplo de Fila

Page 16: Pilhas e Filas

16

Filas circulares

Page 17: Pilhas e Filas

Hierarquia de Classes para implementação no

Framework de Bruno Preiss

Page 18: Pilhas e Filas

18

Java

C++

Page 19: Pilhas e Filas

Implementação Java

Page 20: Pilhas e Filas

20

Hierarquia de Classes

Page 21: Pilhas e Filas

Fundamentos

Page 22: Pilhas e Filas

22

Interface Comparablepublic interface Comparable{ boolean isLT (Comparable object); boolean isLE (Comparable object); boolean isGT (Comparable object); boolean isGE (Comparable object); boolean isEQ (Comparable object); boolean isNE (Comparable object); int compare (Comparable object);}

Page 23: Pilhas e Filas

23

Classe abstrata AbstractObject (1)// pgm05_02.javapublic abstract class AbstractObject implements Comparable{ public final boolean isLT (Comparable object)

{ return compare (object) < 0; } public final boolean isLE (Comparable object)

{ return compare (object) <= 0; } public final boolean isGT (Comparable object)

{ return compare (object) > 0; } public final boolean isGE (Comparable object)

{ return compare (object) >= 0; } public final boolean isEQ (Comparable object)

{ return compare (object) == 0; } public final boolean isNE (Comparable object)

{ return compare (object) != 0; }

Page 24: Pilhas e Filas

24

Classe abstrata AbstractObject (2)

public final boolean equals (Object object) {if(object instanceof Comparable) return isEQ ((Comparable) object);else

return false;}public final int compare (Comparable arg) {

if(getClass () == arg.getClass()) return compareTo (arg);

else return getClass().getName().compareTo(

arg.getClass().getName() );}

protected abstract int compareTo (Comparable arg);}

Page 25: Pilhas e Filas

25

Interface Containerpublic interface Container extends Comparable{ int getCount (); boolean isEmpty (); boolean isFull (); void purge (); void accept (Visitor visitor); Enumeration getEnumeration ();}

Page 26: Pilhas e Filas

26

Classe Abstrata AbstractContainerpublic abstract class AbstractContainer extends AbstractObject implements Container{ protected int count; public int getCount ()

{ return count; } public boolean isEmpty ()

{ return getCount () == 0; } public boolean isFull ()

{ return false; } // ...}

Page 27: Pilhas e Filas

27

Interface Stack

// pgm06_01.java

public interface Stack extends Container{ Object getTop (); void push (Object object); Object pop ();}

Page 28: Pilhas e Filas

28

Interface Queue

// pgm06_13.java

public interface Queue extends Container{ Object getHead (); void enqueue (Object object); Object dequeue ();}

Page 29: Pilhas e Filas

Pilhas

Page 30: Pilhas e Filas

Pilhas Implementadas em Java

Utilizando Arrays

Page 31: Pilhas e Filas

31

Definição da Classe StackAsArray// pgm06_02.txt

public class StackAsArray extends AbstractContainer implements Stack{ protected Object[] array;

// ...}

Page 32: Pilhas e Filas

32

Métodos Construtor e purge da Classe StackAsArray

// pgm06_03.java

public class StackAsArray extends AbstractContainer implements Stack{ protected Object[] array;

public StackAsArray (int size) { array = new Object [size]; }

public void purge () {

while (count > 0) array [--count] = null;

} // ...}

Page 33: Pilhas e Filas

33

Métodos push, pop e getTop da Classe StackAsArray (1)

// pgm06_04.java

public class StackAsArray extends AbstractContainer implements Stack{ protected Object[] array;

public void push (Object object) {

if(count == array.length) throw new ContainerFullException();array [count++] = object;

}

Page 34: Pilhas e Filas

34

Métodos push, pop e getTop da Classe StackAsArray (2)

// pgm06_04.java (Continuação)

public Object pop () {

if(count == 0) throw new ContainerEmptyException(); Object result = array [--count]; array[count] = null; return result;

} public Object getTop () {

if(count == 0) throw new ContainerEmptyException ();

return array [count - 1]; } // ...}

Page 35: Pilhas e Filas

35

Método accept da Classe StackAsArray// pgm06_05.java

public class StackAsArray extends AbstractContainer implements Stack{ protected Object[] array;

public void accept (Visitor visitor) {

for (int i = 0; i < count; ++i) { visitor.visit (array [i]); if(visitor.isDone ())return; }

} // ...}

Page 36: Pilhas e Filas

36

Exemplo de uso de Enumeração (1)

Considere-se o código que se segueStack stack = new StackAsArray (57);stack.push (new Integer (3));stack.push (new Integer (1));stack.push (new Integer (4));Enumeration e = stack.getEnumeration ();while (e.hasMoreElements ()){ Object obj = e.nextElement (); System.out.println (obj);}

Page 37: Pilhas e Filas

37

Exemplo de uso de Enumeração (2)

Este código cria uma instância da classe StackAsArray 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.

Page 38: Pilhas e Filas

38

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.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.

Page 39: Pilhas e Filas

39

Método getEnumeration da Classe StackAsArray// pgm06_06.java

public class StackAsArray extends AbstractContainer implements Stack { protected Object[] array;

public Enumeration getEnumeration() {

return new Enumeration() { protected int position = 0; public boolean hasMoreElements()

{ return position < getCount (); } public Object nextElement() {

if(position >= getCount ()) throw new NoSuchElementException();

return array [position++]; }

}; }}

Page 40: Pilhas e Filas

Pilhas Implementadas em Java

Utilizando Listas Encadeadas

Page 41: Pilhas e Filas

41

Definição da Classe StackAsLinkedList

// pgm06_07.java

public class StackAsLinkedList extends AbstractContainer implements Stack{ protected LinkedList list;

// ...}

Page 42: Pilhas e Filas

42

Métodos Construtor e purge da Classe StackAsLinkedList

// pgm06_08.java

public class StackAsLinkedList extends AbstractContainer implements Stack{ protected LinkedList list;

public StackAsLinkedList () { list = new LinkedList (); }

public void purge () {

list.purge (); count = 0;

} // ...}

Page 43: Pilhas e Filas

43

Métodos push, pop e getTop da Classe StackAsLinkedList (1)

// pgm06_09.java

public class StackAsLinkedList extends AbstractContainer implements Stack{ protected LinkedList list;

public void push (Object object) {

list.prepend (object);++count;

}

Page 44: Pilhas e Filas

44

Métodos push, pop e getTop da Classe StackAsLinkedList (2)

// pgm06_09.java (Continuação)

public Object pop () {

if(count == 0) throw new ContainerEmptyException (); Object result = list.getFirst (); list.extract (result); --count; return result;

} public Object getTop () {

if(count == 0) throw new ContainerEmptyException (); return list.getFirst ();

} // ...}

Page 45: Pilhas e Filas

45

Método accept da Classe StackAsLinkedList

// pgm06_10.java

public class StackAsLinkedList extends AbstractContainer implements Stack{ protected LinkedList list;

public void accept (Visitor visitor) { for(LinkedList.Element ptr = list.getHead (); ptr != null; ptr = ptr.getNext ()) {

visitor.visit (ptr.getDatum ()); if(visitor.isDone ())

return; }

} // ...}

Page 46: Pilhas e Filas

46

Método getEnumeration da Classe StackAsLinkedList (1)

// pgm06_11.java

public class StackAsLinkedList extends AbstractContainer implements Stack{ protected LinkedList list;

Page 47: Pilhas e Filas

47

Método getEnumeration da Classe StackAsLinkedList (1)

// pgm06_11.java (Continuação)

public Enumeration getEnumeration () { return new Enumeration () { protected LinkedList.Element position =list.getHead();

public boolean hasMoreElements (){ return position != null; } public Object nextElement () { if(position == null) throw new NoSuchElementException (); Object result = position.getDatum (); position = position.getNext (); return result; } };

} // ...}

Page 48: Pilhas e Filas

Filas

Page 49: Pilhas e Filas

Filas Implementadas em Java

Utilizando Arrays

Page 50: Pilhas e Filas

50

Definição da Classe QueueAsArray// pgm06_14.java

public class QueueAsArray extends AbstractContainer implements Queue{ protected Object[] array; protected int head; protected int tail;

// ...}

Page 51: Pilhas e Filas

51

Métodos construtor e purge da Classe QueueAsArray (1)

// pgm06_15.java

public class QueueAsArray extends AbstractContainer implements Queue{ protected Object[] array; protected int head; protected int tail;

public QueueAsArray (int size) {

array = new Object [size]; head = 0; tail = size - 1;

}

Page 52: Pilhas e Filas

52

Métodos construtor e purge da Classe QueueAsArray (2)

// pgm06_15.java (Continuação)

public void purge () {

while (count > 0) {

array [head] = null; if (++head == array.length)

head = 0; --count;

} } // ...}

Page 53: Pilhas e Filas

53

Métodos getHead, enqueue e dequeue da Classe QueueAsArray (1)

// pgm06_16.java

public class QueueAsArray extends AbstractContainer implements Queue{ protected Object[] array; protected int head; protected int tail;

public Object getHead () {

if(count == 0) throw new ContainerEmptyException ();

return array [head]; }

Page 54: Pilhas e Filas

54

Métodos getHead, enqueue e dequeue da Classe QueueAsArray (2)

public void enqueue (Object object) { if(count == array.length) throw new ContainerFullException (); if(++tail == array.length) tail = 0; array [tail] = object; ++count;

} public Object dequeue () {

if(count == 0) throw new ContainerEmptyException (); Object result = array [head]; array [head] = null; if(++head == array.length) head = 0; --count; return result;

} // ...}

Page 55: Pilhas e Filas

Filas Implementadas em Java

Utilizando Listas Encadeadas

Page 56: Pilhas e Filas

56

Definição da Classe QueueAsLinkedList

// pgm06_17.java

public class QueueAsLinkedList extends AbstractContainer implements Queue{ protected LinkedList list;

// ...}

Page 57: Pilhas e Filas

57

Métodos construtor e purge da Classe QueueAsLinkedList// pgm06_18.java

public class QueueAsLinkedList extends AbstractContainer implements Queue{ protected LinkedList list;

public QueueAsLinkedList () { list = new LinkedList (); }

public void purge () {

list.purge (); count = 0;

} // ...}

Page 58: Pilhas e Filas

58

Métodos getHead, enqueue e dequeue da Classe QueueAsLinkedList (1)

// pgm06_19.java

public class QueueAsLinkedList extends AbstractContainer implements Queue{ protected LinkedList list;

public Object getHead () {

if(count == 0) throw new ContainerEmptyException ();

return list.getFirst (); }

Page 59: Pilhas e Filas

59

Métodos getHead, enqueue e dequeue da Classe QueueAsLinkedList (2)

// pgm06_19.java (Continuação)

public void enqueue (Object object) {

list.append (object); ++count;

}

public Object dequeue () {

if(count == 0) throw new ContainerEmptyException (); Object result = list.getFirst (); list.extract(result); --count; return result;

} // ...}

Page 60: Pilhas e Filas

Implementação C++

Page 61: Pilhas e Filas

61

Hierarquia de Classes

Page 62: Pilhas e Filas

Fundamentos

Page 63: Pilhas e Filas

63

Definição da Classe Object// pgm05_01.cpp

class Object{protected: virtual int CompareTo (Object const&) const = 0;public: virtual ~Object (); virtual bool IsNull () const; virtual int Compare (Object const&) const; virtual HashValue Hash () const = 0; virtual void Put (ostream&) const = 0;};

Page 64: Pilhas e Filas

64

Operadores da Classe Object// pgm05_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; }

Page 65: Pilhas e Filas

65

Funções membro da Classe Object// pgm05_03.cpp

#include <typeinfo>Object::~Object () {}bool Object::IsNull () const { return false; }int Object::Compare (Object const& object) const{ if(typeid (*this) == typeid (object))

return CompareTo (object); else

if(typeid (*this).before (typeid (object))) return -1;

else return 1;

}

Page 66: Pilhas e Filas

66

Definição da Classe NullObject

//pgm05_04.cpp

class NullObject : public Object{ static NullObject instance;  NullObject ();protected: int CompareTo (Object const&) const;public: bool IsNull () const; HashValue Hash () const; void Put (ostream& s) const;  static NullObject& Instance ();};

Page 67: Pilhas e Filas

67

Funções membro da Classe NullObject

//pgm05_05.cpp

NullObject NullObject::instance;NullObject::NullObject () {}bool NullObject::IsNull () const { return true; }int NullObject::CompareTo (Object const&) const { return 0; } HashValue NullObject::Hash () const { return 0; }void NullObject::Put (ostream& s) const { s << "NullObject"; }NullObject& NullObject::Instance () { return instance; }

Page 68: Pilhas e Filas

68

Definição da Classe Wrapper<T>//pgm05_06.cpp

template <class T>class Wrapper : public Object{protected: T datum;  int CompareTo (Object const&) const;public: Wrapper (); Wrapper (T const&); Wrapper& operator = (T const&); operator T const& () const; HashValue Hash() const; void Put(ostream&) const;};

Page 69: Pilhas e Filas

69

Funções membro da Classe Wrapper<T> (1)

//pgm05_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;}

Page 70: Pilhas e Filas

70

Funções membro da Classe Wrapper<T> (2)

//pgm05_07.cpp (Continuação)

template <class T>Wrapper<T>::operator T const& () const { return datum; } template <class T>int Wrapper<T>::CompareTo (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; }

Page 71: Pilhas e Filas

71

Definição da Classe Container// pgm05_09.cpp

class Container : public virtual Object, public virtual Ownership

{protected: unsigned int count; Container ();public: virtual unsigned int Count () const; virtual bool IsEmpty () const; virtual bool IsFull () const; virtual HashValue Hash () const; virtual void Put (ostream&) const; virtual Iterator& NewIterator () const; virtual void Purge () = 0; virtual void Accept (Visitor&) const = 0;};

Page 72: Pilhas e Filas

72

Funções membro da Classe Container

//pgm05_10.cpp

Container::Container () : count (0) {} unsigned int Container::Count () const { return count; } bool Container::IsEmpty () const { return Count () == 0; } bool Container::IsFull () const { return false; }

Page 73: Pilhas e Filas

73

Definição da Classe Visitor//pgm05_11.cpp

class Visitor{public: virtual void Visit (Object&) = 0; virtual bool IsDone () const

{ return false; }};

Page 74: Pilhas e Filas

74

Função Put da Classe Container (1)//pgm05_12.cpp

#include <typeinfo>class PuttingVisitor : public Visitor{ ostream& stream; bool comma;public: PuttingVisitor (ostream& s) : stream (s), comma (false) {} void Visit (Object& object) {

if (comma) stream << ", "; stream << object; comma = true;

}};

Page 75: Pilhas e Filas

75

Função Put da Classe Container (2)

// pgm05_12.cpp (Conyinuação)

void Container::Put (ostream& s) const{ PuttingVisitor visitor (s);  s << typeid (*this).name () << " {"; Accept (visitor); s << "}";}

Page 76: Pilhas e Filas

76

Definição da Classe Iterator//pgm05_13.cpp

class Iterator{public: virtual ~Iterator (); virtual void Reset () = 0; virtual bool IsDone () const = 0; virtual Object& operator * () const = 0; virtual void operator ++ () = 0;};

Page 77: Pilhas e Filas

77

Funções membro da Classe IteratorIterator& SomeContainer::NewIterator () const { return *new SomeIterator (*this); } SomeContainer c;Iterator& i = c.NewIterator ();while (!i.IsDone ()) { cout << *i << endl; ++i;}delete &i;

Page 78: Pilhas e Filas

78

Definição da Classe NullIterator//pgm05_14.cpp

class NullIterator : public Iterator{public: NullIterator (); void Reset (); bool IsDone () const; Object& operator * () const; void operator ++ ();};

Page 79: Pilhas e Filas

79

Funções membro da Classe NullIterator

//pgm05_15.cpp

NullIterator::NullIterator () {}void NullIterator::Reset () {}bool NullIterator::IsDone () const { return true; }Object& NullIterator::operator * () const { return NullObject::Instance (); }void NullIterator::operator ++ () {} // pgm05_16.cppIterator& Container::NewIterator () const { return *new NullIterator (); }

Page 80: Pilhas e Filas

80

Definição da Classe Stack// pgm06_01.cpp

class Stack : public virtual Container{public: virtual Object& Top () const = 0; virtual void Push (Object&) = 0; virtual Object& Pop () = 0;};

Page 81: Pilhas e Filas

Pilhas

Page 82: Pilhas e Filas

Pilhas Implementadas em C++

Utilizando Arrays

Page 83: Pilhas e Filas

83

Definição da Classe Stack// pgm06_01.cpp

class Stack : public virtual Container{public: virtual Object& Top () const = 0; virtual void Push (Object&) = 0; virtual Object& Pop () = 0;};

Page 84: Pilhas e Filas

84

Definição da Classe StackAsArray

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

Page 85: Pilhas e Filas

85

Definição da Classe StackAsArray// pgm06_02.cpp

class StackAsArray : public Stack { Array<Object*> array; class Iter;public: StackAsArray (unsigned int); // ... friend class Iter;};class StackAsArray::Iter : public Iterator { StackAsArray const& stack; unsigned int position;public: Iter (StackAsArray const&); // ...};

Page 86: Pilhas e Filas

86

Funções membro Construtor, Destrutor e Purge da Classe StackAsArray

// pgm06_03.cpp

StackAsArray::StackAsArray (unsigned int size) : array(size) {}void StackAsArray::Purge (){ if(IsOwner ()) {

for(unsigned int i = 0; i < count; ++i) delete array [i];

} count = 0;}StackAsArray::~StackAsArray () { Purge (); }

Page 87: Pilhas e Filas

87

Funções membro Push, Pop e Top da Classe StackAsArray

// pgm06_04.cpp

void StackAsArray::Push (Object& object) { if(count == array.Length ())

throw domain_error ("stack is full"); array [count++] = &object;}Object& StackAsArray::Pop (){ if(count == 0)

throw domain_error ("stack is empty"); return *array [--count];}Object& StackAsArray::Top () const{ if(count == 0)

throw domain_error ("stack is empty"); return *array [count - 1U];}

Page 88: Pilhas e Filas

88

Função membro Accept da Classe StackAsArray

// pgm06_05.cpp

void StackAsArray::Accept (Visitor& visitor) const{ for(unsigned int i = 0; i < count && !visitor.IsDone(); +

+i) {

visitor.Visit (*array [i]); }}

Page 89: Pilhas e Filas

89

Funções membro da Classe StackAsArray::Iter

Na definição da classe StackAsArray foi definida uma classe embutida IterA classe StackAsArray::Iter é uma classe friend  da classe StackAsArray tendo acesso às variáveis membro e funções privados daquela classe A implementação do iterator depende da implementação do container

Page 90: Pilhas e Filas

90

Funções membro da Classe StackAsArray::Iter (1)

// pgm06_06.cpp

StackAsArray::Iter::Iter (StackAsArray const& _stack) : stack (_stack) { Reset (); }

bool StackAsArray::Iter::IsDone () const { return position >= stack.count; }

Object& StackAsArray::Iter::operator * () const{ if(position < stack.count)

return *stack.array [position]; else

return NullObject::Instance ();}

Page 91: Pilhas e Filas

91

Funções membro da Classe StackAsArray::Iter (2)

// pgm06_06.cpp (ContinuaçÃo)

void StackAsArray::Iter::operator ++ (){ if(position < stack.count)

++position;}

void StackAsArray::Iter::Reset () { position = 0; }

Page 92: Pilhas e Filas

92

Exemplo de uso de Iterator

Considere-se o código que se segue

StackAsArray stack;stack.Push (*new Int (3));stack.Push (*new Int (1));stack.Push (*new Int (4));Iterator& i = stack.NewIterator ();while (!i.IsDone ()) { cout << *i << endl; ++i;}delete &i;

Page 93: Pilhas e Filas

93

Exemplo de uso de Iterator

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

Page 94: Pilhas e Filas

Pilhas Implementadas em C++

Utilizando Listas Encadeadas

Page 95: Pilhas e Filas

95

Definição da Classe StackAsLinkedList

// pgm06_07.cpp

class StackAsLinkedList : public Stack { LinkedList<Object*> list; class Iter;public: StackAsLinkedList (); // ... friend class Iter;};class StackAsLinkedList::Iter : public Iterator { StackAsLinkedList const& stack; ListElement<Object*> const* position;public: Iter (StackAsLinkedList const&); // ...};

Page 96: Pilhas e Filas

96

Funções membro Construtor, Destrutor e Purge da Classe StackAsLinkedList

// pgm06_08.cpp

StackAsLinkedList::StackAsLinkedList () : list () {}void StackAsLinkedList::Purge (){ if(IsOwner()) {

ListElement<Object*> const* ptr; for (ptr = list.Head (); ptr != 0; ptr = ptr->Next ()) delete ptr->Datum ();

} list.Purge (); count = 0;}StackAsLinkedList::~StackAsLinkedList () { Purge (); }

Page 97: Pilhas e Filas

97

Funções membro Push, Pop e Top da Classe StackAsLinkedList (1)

// pgm06_09.cpp

void StackAsLinkedList::Push (Object& object){ list.Prepend (&object); ++count;}

Object& StackAsLinkedList::Pop (){ if(count == 0)

throw domain_error ("stack is empty"); Object& const result = *list.First (); list.Extract (&result); --count; return result;}

Page 98: Pilhas e Filas

98

Funções membro Push, Pop e Top da Classe StackAsLinkedList (2)

// pgm06_09.cpp (Continuação)

Object& StackAsLinkedList::Top () const{ if(count == 0)

throw domain_error ("stack is empty"); return *list.First ();}

Page 99: Pilhas e Filas

99

Função membro Accept da Classe StackAsLinkedList

// pgm06_10.cpp

void StackAsLinkedList::Accept (Visitor& visitor) const{ ListElement<Object*> const* ptr;

for(ptr = list.Head ();ptr != 0 && !visitor.IsDone (); ptr = ptr->Next ())

{ visitor.Visit (*ptr->Datum ());

}}

Page 100: Pilhas e Filas

100

Funções membro da Classe StackAsLinkedList::Iter (1)

// pgm06_11.cpp

StackAsLinkedList::Iter::Iter ( StackAsLinkedList const& _stack) : stack (_stack) { Reset (); }

bool StackAsLinkedList::Iter::IsDone () const { return position == 0; }

Object& StackAsLinkedList::Iter::operator * () const{ if(position != 0)

return *position->Datum (); else

return NullObject::Instance ();}

Page 101: Pilhas e Filas

101

Funções membro da Classe StackAsLinkedList::Iter (2)

// pgm06_11.cpp (Continuação)

void StackAsLinkedList::Iter::operator ++ (){ if(position != 0)

position = position->Next ();}

void StackAsLinkedList::Iter::Reset () { position = stack.list.Head (); }

Page 102: Pilhas e Filas

Filas

Page 103: Pilhas e Filas

Filas Implementadas em C++

Utilizando Arrays

Page 104: Pilhas e Filas

104

Definição da Classe Queue// pgm06_13.cpp

class Queue : public virtual Container{public: virtual Object& Head () const = 0; virtual void Enqueue (Object&) = 0; virtual Object& Dequeue () = 0;};

Page 105: Pilhas e Filas

105

Definição da Classe QueueAsArray// pgm06_14.cpp

class QueueAsArray : public virtual Queue{protected: Array<Object*> array; unsigned int head; unsigned int tail;public: QueueAsArray (unsigned int); ~QueueAsArray (); // ...};

Page 106: Pilhas e Filas

106

Funções membro Construtor, Destrutor e Purge da Classe QueueAsArray (1)

// pgm06_15.cpp

QueueAsArray::QueueAsArray (unsigned int size) : array (size), head (0), tail (size - 1U) {}

Page 107: Pilhas e Filas

107

Funções membro Construtor, Destrutor e Purge da Classe QueueAsArray (2)

// pgm06_15.cpp (Continuação)

void QueueAsArray::Purge (){ if(IsOwner ()) {

for(unsigned int i = 0; i < count; ++i) { delete array [head]; if(++head == array.Length ()) head = 0; }

} count = 0;}

QueueAsArray::~QueueAsArray () { Purge (); }

Page 108: Pilhas e Filas

108

Funções membro Head, Enqueue e Dequeue da Classe QueueAsArray (1)

// pgm06_16.cpp

Object& QueueAsArray::Head () const{ if(count == 0)

throw domain_error ("queue is empty"); return *array [head];}void QueueAsArray::Enqueue (Object& object){ if(count == array.Length ())

throw domain_error ("queue is full"); if(++tail == array.Length ())

tail = 0; array [tail] = &object; ++count;}

Page 109: Pilhas e Filas

109

Funções membro Head, Enqueue e Dequeue da Classe QueueAsArray (2)

// pgm06_16.cpp (Continuação)

Object& QueueAsArray::Dequeue (){ if (count == 0)

throw domain_error ("queue is empty"); Object& result = *array [head]; if (++head == array.Length ())

head = 0; --count; return result;}

Page 110: Pilhas e Filas

Filas Implementadas em C++

Utilizando Listas Encadeadas

Page 111: Pilhas e Filas

111

Definição da Classe QueueAsLinkedList

// pgm06_17.cpp

class QueueAsLinkedList : public virtual Queue{protected: LinkedList<Object*> list;public: QueueAsLinkedList (); ~QueueAsLinkedList (); // ...};

Page 112: Pilhas e Filas

112

Funções membro Construtor, Destrutor e Purge da Classe QueueAsLinkedList

// pgm06_18.cpp

QueueAsLinkedList::QueueAsLinkedList () : list () {}void QueueAsLinkedList::Purge () { if(IsOwner ()) {

ListElement<Object*> const* ptr; for(ptr = list.Head (); ptr != 0; ptr = ptr->Next ()) delete ptr->Datum ();

} list.Purge (); count = 0;}QueueAsLinkedList::~QueueAsLinkedList () { Purge (); }

Page 113: Pilhas e Filas

113

Funções membro Head, Enqueue e Dequeue da Classe QueueAsLinkedList (1)

// pgm06_19.cpp

Object& QueueAsLinkedList::Head () const{ if (count == 0)

throw domain_error ("queue is empty"); return *list.First ();}

void QueueAsLinkedList::Enqueue (Object& object){ list.Append (&object); ++count;}

Page 114: Pilhas e Filas

114

Funções membro Head, Enqueue e Dequeue da Classe QueueAsLinkedList (2)

// pgm06_19.cpp (Continuação)

Object& QueueAsLinkedList::Dequeue (){ if(count == 0)

throw domain_error ("queue is empty"); Object& result = *list.First (); list.Extract (&result); --count; return result;}