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