MR PROGRAMATOR

Clase Pila con plantillas "Templates"

#pragma once

#define n 100

template <class tipo>

class Pila

{

      tipo pila[n];

      int tope;

      public:

            Pila(void);

            ~Pila(void);

            bool Pila_vacia();

            bool Pila_llena();

            bool insertar(tipo dato);

            bool insertar_ordenado(tipo elem);

            bool ordenar();

            bool eliminar();

            int ver_tope();

            tipo elemento();

            bool invertir();

            bool eliminar_duplicados();

            bool eliminar_triplicados();

            bool eliminar_pares();

            bool eliminar_impares();

           

};

template <class tipo>

Pila<tipo>::Pila(void)

{

      tope = -1;

}

template <class tipo>

Pila<tipo>::~Pila(void)

{

}

template <class tipo>

bool Pila<tipo>::Pila_vacia()

{

      if(tope ==-1) return true;

      else return false;

}

template <class tipo>

bool Pila<tipo>::Pila_llena()

{

      if(tope == n) return true;

      else return false;

}

template <class tipo>

bool Pila<tipo>::insertar(tipo dato)

{

      if(Pila_llena()) return false;

      else

      {

            tope++;

            pila[tope] = dato;

            return true;

      }

}

template <class tipo>

bool Pila<tipo>::ordenar()

{

      if(Pila_vacia()) return false;

      else

      {

            Pila<tipo> aux;

            while(!Pila_vacia())

            {

                  aux.insertar_ordenado(pila[tope]);

                  eliminar();

            }

            while(!aux.Pila_vacia())

            {

                  insertar_ordenado(aux.pila[aux.tope]);

                  aux.eliminar();

            }

            return true;

      }

}

template <class tipo>

bool Pila<tipo>::eliminar()

{

      if(Pila_vacia()) return false;

      else

      {

            tope--;

            return true;

      }

}

template <class tipo>

tipo Pila<tipo>::elemento()

{

      return pila[tope];

}

template <class tipo>

int Pila<tipo>::ver_tope()

{

      return tope;

}

template <class tipo>

bool Pila<tipo>::invertir()

{

      if(Pila_vacia()) return false;

      else

      {

            Pila<tipo> p_aux1,p_aux2;

            while(!Pila_vacia())

            {

                  p_aux1.insertar(pila[tope]);

                  eliminar();

            }

            while(!p_aux1.Pila_vacia())

            {

                  p_aux2.insertar(p_aux1.pila[p_aux1.tope]);

                  p_aux1.eliminar();

            }

            while(!p_aux2.Pila_vacia())

            {

                  insertar(p_aux2.pila[p_aux2.tope]);

                  p_aux2.eliminar();

            }

            return true;

      }

}

template <class tipo>

bool Pila<tipo>::eliminar_duplicados()

{

      if(Pila_vacia()) return false;

      else

      {

            Pila<tipo> pila1,pila2;

            tipo aux;

            aux = pila[tope];

            eliminar();

            while(!Pila_vacia())

            {

                  if(pila[tope] != aux)

                        pila1.insertar(pila[tope]);

                  eliminar();

            }    

            insertar(aux);

            while(!pila1.Pila_vacia() || !pila2.Pila_vacia())

            {

                  if(pila2.Pila_vacia())

                  {

                        pila1.invertir();

                        aux = pila1.pila[pila1.tope];

                        pila1.eliminar();

                        while(!pila1.Pila_vacia())

                        {

                             if(pila1.pila[pila1.tope] != aux)

                                   pila2.insertar(pila1.pila[pila1.tope]);

                             pila1.eliminar();

                        }

                        insertar(aux);

                  }

                  else if(pila1.Pila_vacia())

                  {

                        pila2.invertir();

                        aux = pila2.pila[pila2.tope];

                        pila2.eliminar();

                        while(!pila2.Pila_vacia())

                        {

                             if(pila2.pila[pila2.tope] != aux)

                                   pila1.insertar(pila2.pila[pila2.tope]);

                             pila2.eliminar();

                        }

                        insertar(aux);

                  }

            }

            invertir();

            return true;

      }

}

template <class tipo>

bool Pila<tipo>::eliminar_triplicados()

{

      if(Pila_vacia()) return false;

      else

      {

            Pila<tipo> aux1,aux2;

            while(!Pila_vacia())

            {

                  if(aux1.Pila_vacia() || aux1.pila[aux1.tope] != pila[tope])

                  {

                        if(!aux2.Pila_vacia())

                        {

                             aux1.insertar(aux2.pila[aux2.tope]);

                             aux2.eliminar();

                        }

                        aux1.insertar(pila[tope]);

                  }

                       

                  else if(pila[tope] == aux1.pila[aux1.tope])

                  {

                        if(aux2.Pila_vacia() || pila[tope] != aux2.pila[aux2.tope])

                             aux2.insertar(pila[tope]);

                  }

                  eliminar();

            }

            while(!aux1.Pila_vacia())

            {

                  insertar(aux1.pila[aux1.tope]);

                  aux1.eliminar();

            }

            return true;

      }

}

 

template <class tipo>

bool Pila<tipo>::eliminar_pares()

{

      if(Pila_vacia()) return false;

      else

      {

            Pila<tipo> aux;

            while(!Pila_vacia())

            {

                  if(pila[tope]%2 != 0)

                        aux.insertar(pila[tope]);

                  eliminar();

            }

            while(!aux.Pila_vacia())

            {

                  insertar(aux.pila[aux.tope]);

                  aux.eliminar();

            }

            return true;

      }

}

 

template <class tipo>

bool Pila<tipo>::eliminar_impares()

{

      if(Pila_vacia()) return false;

      else

      {

            Pila<tipo> aux;

            while(!Pila_vacia())

            {

                  if(pila[tope]%2 == 0)

                        aux.insertar(pila[tope]);

                  eliminar();

            }

            while(!aux.Pila_vacia())

            {

                  insertar(aux.pila[aux.tope]);

                  aux.eliminar();

            }

            return true;

      }

}

 

template<class tipo>

bool Pila<tipo>::insertar_ordenado(tipo elem)

{

      if(Pila_llena()) return false;

      else

      {

            if(Pila_vacia()) insertar(elem);

            else

            {

                  Pila<tipo> aux;

                  while(pila[tope]>elem && !Pila_vacia())

                  {

                        aux.insertar(pila[tope]);

                        eliminar();

                  }

                  insertar(elem);

                  while(!Pila_vacia())

                  {

                        aux.insertar(pila[tope]);

                        eliminar();

                  }

                  while(!aux.Pila_vacia())

                  {

                        insertar(aux.pila[aux.tope]);

                        aux.eliminar();

                  }

            }

            return true;

      }

}


Este sitio web fue creado de forma gratuita con PaginaWebGratis.es. ¿Quieres también tu sitio web propio?
Registrarse gratis