C++
Home

Pilha de tipos

 

Vamos demonstrar o exemplo da pilha.
Existem duas restrições para tipos de dados não primitivos no exemplo: eles devem ter um construtor default e devem suportar o operador de atribuição.

As definições de funções das classes gabaritos devem ficar no arquivo .h

// tstatck.h

#ifndef TSTACK_H
#define TSTACK_H

// uma stack é uma pilha

template< class Tipo >
class Pilha {

  public :
    Pilha( int = 10 );
    ~Pilha();
    //~Pilha() { delete [] ponteiro; }

    // push = inserir
    bool push( const Tipo & );

    // pop = excluir
    bool pop( Tipo & );

  private:
    int tamanho;
    int topo;

    // ponteiro para pilha
    Tipo *ponteiro;

    //bool vazio() const { return topo == -1; };
    bool vazio() const;

    //bool cheio() const { return topo == tamanho - 1; }
    bool cheio() const;
};

// definiçoes em .h

template< class Tipo >
Pilha< Tipo >::Pilha( int vtamanho)
{
  tamanho = vtamanho > 0 ? vtamanho : 10;

  // inicialmente a pilha está fazia
  topo = -1;

  // aloca espaço para elementos
  ponteiro = new Tipo[ tamanho ];
}

// destrutor
template< class Tipo >
Pilha< Tipo >::~Pilha()
{
  delete [] ponteiro;
}

// Insere um elemento na pilha
template< class Tipo >
bool Pilha< Tipo >::push( const Tipo &novo_item )
{
  if ( !cheio() )  
  {  
    ponteiro[ ++topo ] = novo_item;
    return true;
  }

  return false;
}

template< class Tipo >
bool Pilha< Tipo >::pop( Tipo &item )
{
  if ( !vazio() ) 
  { 
    item = ponteiro[ topo-- ];
    return true;
  }

  return false;
}

template< class Tipo >
bool Pilha< Tipo >::vazio() const
{
  return topo == -1;
}

template< class Tipo >
bool Pilha< Tipo >::cheio() const
{
  return topo == tamanho - 1;
}

#endif

 

// main.cpp

#include <iostream>

using std::cout;
using std::cin;
using std::endl;

#include "tstack.h"

int main()
{

  Pilha< double > Tdouble_pilha( 5 );
  double f = 1.1;

  cout << "Inserindo elementos " << endl;

  while ( Tdouble_pilha.push( f ) )
  {  
     cout << f << " ";
     f += 1.1;
  }  

  cout << "\n\nA pilha ficou cheia " << endl;
  cout << "Retirando elementos" << endl;

  while ( Tdouble_pilha.pop( f ) )
  {  
    cout << f << " ";
  }

  cout << "\n\nA pilha ficou vazia " << endl;

  Pilha< int > Tint_pilha( 5 );
  int a = 1;

  cout << "Inserindo elementos " << endl;

  while ( Tint_pilha.push( a ) )
  {  
    cout << a << " ";
    a += 1;
  } 

  cout << "\n\nA pilha ficou cheia " << endl;
  cout << "Retirando elementos" << endl;

  while ( Tint_pilha.pop( a ) )
  {  
    cout << a << " ";
  }

  cout << "\n\nA pilha ficou vazia " << endl;

  system("pause");

  return 0;
}