[ create a new paste ] login | about

Link: http://codepad.org/eEsM7ZJy    [ raw code | output | fork ]

C++, pasted on May 26:
// Pru_Pila.cpp: Prueba de plantilla pila
// Mayo 2015 Tutoriales En Linea

#include <iostream>
#include <cstring>

using namespace std;

// INICIO Cadena
class Cadena {
  public:
   Cadena(const char *cad) {
      cadena = new char[strlen(cad)+1];
      strcpy(cadena, cad);
   }
   Cadena() : cadena(NULL) {}
   Cadena(const Cadena &c) : cadena(NULL) {*this = c;}
   ~Cadena() { if(cadena) delete[] cadena; }
   Cadena &operator=(const Cadena &c) {
      if(this != &c) {
         if(cadena) delete[] cadena;
         if(c.cadena) {
            cadena = new char[strlen(c.cadena)+1];
            strcpy(cadena, c.cadena);
         }
         else cadena = NULL;
      }
      return *this;
   }
   const char* Lee() const {return cadena;}
   
  private:
   char *cadena;
};

ostream& operator<<(ostream &os, const Cadena& cad) {
   os << cad.Lee();
   return os;
}
/// FIN Cadena

// Plantilla para pilas genéricas:
template <class T>
class Pila {
   // Plantilla para nodos de pila, definición 
   // local, sólo accesible para Pila:
   template <class Tn>
   class Nodo {
     public:
      Nodo(const Tn& t, Nodo<Tn> *ant) : anterior(ant) {
         pT = new Tn(t);
      }
      Nodo(Nodo<Tn> &n) { // Constructor copia
         // Invocamos al constructor copia de la clase de Tn
         pT = new Tn(*n.pT); 
         anterior = n.anterior;
      }
      ~Nodo() { delete pT; }
      Tn *pT;
      Nodo<Tn> *anterior;
   };
   ///// Fin de declaración de plantilla de nodo /////
   
  // Declaraciones de Pila:
  public:
   Pila() : inicio(NULL) {} // Constructor
   ~Pila() { while(inicio) Pop(); }
   void Push(const T &t) {
      Nodo<T> *aux = new Nodo<T>(t, inicio);
      inicio = aux;
   }
   T Pop() {
      T temp(*inicio->pT);
      Nodo<T> *aux = inicio;
      inicio = aux->anterior;
      delete aux;
      return temp;
   }
   bool Vacia() { return inicio == NULL; }

  private:
   Nodo<T> *inicio;
};


// Ejemplo de plantilla de función:
template <class T>
void Intercambia(T &x, T &y) {
   Pila<T> pila;

   pila.Push(x);
   pila.Push(y);
   x = pila.Pop();
   y = pila.Pop();
}

int main() {
   Pila<int> PilaInt;
   Pila<Cadena> PilaCad;

   int x=13, y=21;
   Cadena cadx("Cadena X");
   Cadena cady("Cadena Y ----");

   cout << "x=" << x << endl;
   cout << "y=" << y << endl;
   Intercambia(x, y);
   cout << "x=" << x << endl;
   cout << "y=" << y << endl;

   cout << "cadx=" << cadx << endl;
   cout << "cady=" << cady << endl;
   Intercambia(cadx, cady);
   cout << "cadx=" << cadx << endl;
   cout << "cady=" << cady << endl;

   PilaInt.Push(32);
   PilaInt.Push(4);
   PilaInt.Push(23);
   PilaInt.Push(12);
   PilaInt.Push(64);
   PilaInt.Push(31);

   PilaCad.Push("uno");
   PilaCad.Push("dos");
   PilaCad.Push("tres");
   PilaCad.Push("cuatro");

   cout << PilaInt.Pop() << endl;
   cout << PilaInt.Pop() << endl;
   cout << PilaInt.Pop() << endl;
   cout << PilaInt.Pop() << endl;
   cout << PilaInt.Pop() << endl;
   cout << PilaInt.Pop() << endl;

   cout << PilaCad.Pop() << endl;
   cout << PilaCad.Pop() << endl;
   cout << PilaCad.Pop() << endl;
   cout << PilaCad.Pop() << endl;

   return 0;
}


Output:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
x=13
y=21
x=21
y=13
cadx=Cadena X
cady=Cadena Y ----
cadx=Cadena Y ----
cady=Cadena X
31
64
12
23
4
32
cuatro
tres
dos
uno


Create a new paste based on this one


Comments: