- #include <_vector.h> 
- #include <_llist.h> 
- #include <iostream> 
- #include <cstdlib> 
- using namespace std; 
-   
- template <class T> 
- class baseStack { 
- public: 
-   virtual void  clear  () = 0; 
-   /* Modifica: la pila receptora que pasa a estar vacía. */ 
-   virtual bool  empty  () const = 0; 
-   /* Produce:  cierto si la pila receptora es vacía.   */ 
-   virtual T      top    () const = 0; 
-   /* Produce:  el elemento del tope de la pila. 
-      Error:    si la pila está vacía.                */ 
-   virtual void  push    (const T & value) = 0; 
-   /* Necesita: un valor de tipo T. 
-      Modifica: la pila receptora añadiendo el valor 
-          indicado al tope de la pila.    */ 
-   virtual void  pop    () = 0; 
-   /* Modifica: la pila receptora suprimiendo el elemento 
-                situado en el tope de la pila. 
-      Error:    si la pila está vacía.                    */ 
- }; 
-   
-   
- //--------------------------------------------------------------------------- 
- //                                                  
- //         Definicion de la clase VStack 
- //                  Pilas basadas en vectores              
- //                                                
- //--------------------------------------------------------------------------- 
-   
- // 
- // Clase VStack 
- //  Implementacion de pilas utilizando vectores  
- // 
-   
- template <class T> 
- class VStack : public baseStack<T> { 
- public: 
-   // constructores 
-   explicit VStack  (int size=0); 
-   VStack          (const VStack<T> & rhs); 
-    
-   // operaciones para pilas 
-   virtual void   clear  (); 
-   /* Coste t.: O(1)    */ 
-   virtual bool   empty  () const; 
-   /* Coste t.: O(1)    */ 
-   virtual T  top    () const; 
-   /* Coste t.: O(1)    */ 
-   virtual void  push  (const T & value); 
-   /* Coste t.: O(1), O(n) si se redimensiona.  */ 
-   virtual void  pop    (); 
-   /* Coste t.: O(1)    */ 
-     
-   // asignacion 
-   VStack<T> & operator =  (const VStack<T> & rhs); 
-    
-   //operaciones adicionales 
-   int size () const; 
-   // Produce:  el numero de elementos de la lista.  
-   // Coste t.: O(1) 
-      
- protected: 
-   // area de datos 
-   sVector<T>  data; 
-   int  theTop;      // posicion del tope de la pila 
-    
-   //operaciones privadas para el control de errores 
-   void assertIsEmpty() const;    
- }; 
- template <class T> 
- VStack<T>::VStack 
-   (int size) : data(size), theTop(-1) 
- { 
-   // crea e inicializa una pila 
- } 
-   
- template <class T> 
- VStack<T>::VStack (const VStack<T> & rhs) 
-   : data(rhs.data), theTop(rhs.theTop) 
- {  
-   // constructor de copia 
- } 
-   
- template <class T> 
- void VStack<T>::clear () 
- { 
-   // borra los elementos de una pila 
-   theTop = -1; 
- } 
-   
- template <class T> 
- bool VStack<T>::empty () const 
- { 
-   // retorna cierto si la pila no tiene elementos 
-   return theTop == -1; 
- } 
-   
- template <class T> 
- T VStack<T>::top () const 
- { 
-   // retorna el elemento del tope de la pila 
-   assertIsEmpty(); 
-   return data[theTop]; 
- } 
-   
- template <class T> 
- void VStack<T>::push (const T & value) 
- { 
-   // inserta un elemento en la pila 
-   // si la pila está llena, aumentarla 
-   if (theTop == data.size()-1) 
-     data.resize(data.size()*2+1); 
-    
-   data[++theTop] = value; 
- } 
-   
- template <class T> 
- void VStack<T>::pop () 
- { 
-   // borra el elemento del tope de la pila 
-   assertIsEmpty(); 
-   theTop--; 
- } 
-   
- template <class T> 
- VStack<T> & VStack<T>::operator = (const VStack<T> & rhs) 
- { 
-   // asignacion  
-   if( this != &rhs ) 
-   { 
-     data = rhs.data; 
-     theTop = rhs.theTop; 
-   }   
-   return *this; 
- } 
-   
- template <class T> 
- int VStack<T>::size () const 
- { 
-    return theTop+1; 
- } 
-   
- template <class T> 
- void VStack<T>::assertIsEmpty( ) const 
- { 
-   if ( empty() ) 
-      throw runtime_error("VStack UnderFlow");  
- }     
- int main() { 
- VStack<int> v1; 
- system("PAUSE"); 
- return 0; 
- } 
-   
-