Template para Pilhas [RESOLVIDO]

1. Template para Pilhas [RESOLVIDO]

Daniel Andrade
dandrade

(usa Fedora)

Enviado em 02/10/2014 - 18:21h

Olá! Seguinte implementei todas as funcoes de uma Pilha
usando Templates, de modo que posso criar Pilha de int,double,floar... conforme a declaração da variavel.

E depois, fiz umas funcoes genericas para obter o somatorio,
maior ou menor, tambem qualquer tipo de vetor.

A minha, duvida é como fazer a implementação com template para Pilha, com funcoes : maior, menor, par, impar... somatoria, enfim não estou sabendo a sintaxe, como misturar?!

Grato


/**** main exemplo
#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <stdio.h>
#include <ctype.h> //biblioteca p/ as funções isalpha isdigit toupper tolower
#include <unistd.h> //sleep
#include <locale.h>
#include <string.h>
#include <stdio.h>

#include \"pilhas.h\"
#include \"template.h\"

Pilha<char> p(5); // cria uma pilha de char de tamanho 5
p.exibe();
cout << \"<>\";
p.insere(\'a\');
p.insere(\'b\');
cout << \" elementos=\" << p.exibe() << \"??\"; // ***** PORQUE SEQUENCIA DE EXECUCAO DA LINHA E DE TRAZ PRA FRENTE
cout << endl << \" <<< INCOERENCIA RESULTADO ACIMA \" << endl;
p.exibe();
p.insere(\'c\');
// while( !p.vazia() ) cout << p << endl;
while( !p.vazia() ) cout << p.remove() << endl; //percorre a pilha e remove elementos
Pilha<double> q(5); // cria uma pilha de double
q.insere(1.2);
q.insere(3.4);
q.insere(5.6);
q.exibe();
//cout >> Pilhamenor(q);// >> \" \" >> maior(q) >> \"pilha\";
while( !q.vazia() ) cout << q.remove() << endl;



/*** fim main


/***** Pilha.h

/*********CLASSE DO CONTEUDO DE UMA PILHA************/
template <class Tipo>
class Pilha {
public:
Pilha(int); //construtor
~Pilha(void); //destrutor
//Tipo seleta(char a);
void insere(Tipo); //insere um elemento na pilha
Tipo remove(void); //remove um elemento na pilha
Tipo reseta(void);
Tipo exibe(void);
Tipo exibir(void);
Tipo topo(void);
Tipo anterior(void);
bool vazia(void);
bool cheia(void);
private:
int max;
int pos;
int top;
Tipo *mem; //cria um ponteiro para Pilha
};

template <class Tipo> Pilha<Tipo>::Pilha(int n)
{
top = -1;
pos= -1;
mem = new Tipo[max = n]; //aloca a memoria conforme tamanho definido em max
}
template <class Tipo> Pilha<Tipo>::~Pilha(void)
{
delete[] mem; //deleta o ponteiro excluindo o recurso
}
template <class Tipo> Tipo Pilha<Tipo>::reseta(void)
{
top=-1; //zera o indice resetando a pilha a tamanho nulo
return 0;
}

template <class Tipo> void Pilha<Tipo>::insere(Tipo e)
{
if( !cheia() ) mem[++top] = e;

}
template <class Tipo> Tipo Pilha<Tipo>::remove(void)
{
if( !vazia() ) return mem[top--];

}
template <class Tipo> Tipo Pilha<Tipo>::topo(void)
{
if( !vazia() ) return mem[top];
else return 0;

}
template <class Tipo> Tipo Pilha<Tipo>::anterior(void)
{
if( !vazia() ) return mem[top-1];
else return 0;

}
template <class Tipo> bool Pilha<Tipo>::vazia(void)
{
if(top==-1)return true;
else return false;
}
template <class Tipo> bool Pilha<Tipo>::cheia(void)
{
if(top==max-1)return true;
else return false;
// PORQUE NAO FUNCIONA TERNARIO top == max -1 ? return true : return false;

}
template <class Tipo> Tipo Pilha<Tipo>::exibe(void)
{
int count=top;

if(!vazia())for(;count>-1;count--)cout << mem[count];// << \" Posição=\" << count << endl;
else cout << \"Pilha vazia\" << endl;
return 0;
}
// FUNCAO RECURSIVA EXIBIÇÃO
template <class Tipo> Tipo Pilha<Tipo>::exibir(void)
{

if(pos<0)pos=top; //inicializa na entrada da chamada

//pos>0 ? cout << mem[pos--],exibir() : return 0; //no final pos=-1 condição inicial

}
/***** FIM pilha.h
/****** TEMPLATES GENERICOS **** Template.h
#ifndef TEMPLATE_H_INCLUDED
#define TEMPLATE_H_INCLUDED

template <class T, int N>
int vetorsize( T (&tab)[N] ) { // aplicação => int x= vetorsize(array variavel);
return N; //retorna o tamanho do array
}

// Somatoria dos elementos
template <class T, int N>
T somatoria(T (&vetor)[N]){
int register c;
T acum=0; //cria variavel do mesmo tipo da chamada

for(c=0;c<N;c++)acum+=vetor[c];
//printf(\"\\nTAM %d vetor=%d acum=%d \",N,vetor[c],acum);
return acum;
}

//******************* COM RECURSÃO ***************************

// somatoria dos elementos com recursão chamada acumulado(array, elementos a somar);
template <class T, int N>
T acumulador(T (&vetor),int k){

int register c=N;
T acum=NULL; //cria variavel do mesmo tipo da chamada com valor NEUTRO
if(k < vetorsize(&vetor))acum+=acumulador(&vetor,k++);
else return acum;
// o que esta errado no ternario
// k < vetorsize(&vetor) ? acum+=acumulador(&vetor,k++),return acum;

}


//Encontra o maior valor
template <class K, int N>
K maior(K (&vetor)[N]){
int register c ;
K ve[0]; //cria variavel do mesmo tipo da chamada com valor NEUTRO
ve[0]=vetor[0]; //
for(c=0;c<N;c++){
if(vetor[c]>ve[0])ve[0]=vetor[c];
}
return ve[0];
}
//Encontra o menor valor
template <class K, int N>
K menor(K (&vetor)[N]){
int register c ;
K ve[0]; //cria variavel do mesmo tipo da chamada com valor NEUTRO
ve[0]=vetor[0]; //
for(c=0;c<N;c++){
if(vetor[c]<ve[0])ve[0]=vetor[c];
}
return ve[0];
}

/******************* Fim Template.h









  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 03/10/2014 - 15:22h

Vou falar genericamente porque não li seu código todo (ajudaria a ler se você tivesse usado indentação e colocado a transcrição dentro das tags[code]” e “[/code]”).

Operações como obter o maior de todos, menor de todos, média e outras que têm de varrer todos os valores acabam saindo caras no caso de pilhas, porque, por sua própria natureza, elas só permitem inspecionar o elemento no topo, colocar novos elementos no topo ou remover elementos do topo. Para varrer todos os elementos, você teria de desempilhar todos eles, usando uma segunda pilha para guardá-los temporariamente (invertendo sua ordem), e depois desempilhar todos dessa segunda pilha e voltar com eles para a pilha original, a fim de restaurar sua ordem inicial.

Lógico que nós sabemos que, internamente, pilhas geralmente são mapeadas em listas ou vetores (o próprio std::stack da biblioteca padrão do C++ é meramente um adaptador de interface, construído sobre outro container de sua preferência, como std::list, std::vector ou std::deque (que é o default)), e você poderia usar o conhecimento dessa estrutura interna para realizar com mais eficiência operações que necessitam de uma varredura de todos os elementos. Só que essa estrutura interna não deve aparecer para o usuário final da pilha.





Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts