IT++ Logo

stack.h

Go to the documentation of this file.
00001 
00036 #ifndef STACK_H
00037 #define STACK_H
00038 
00039 #include <itpp/base/itassert.h>
00040 
00041 
00042 namespace itpp
00043 {
00044 
00066 template<class T>
00067 class Stack
00068 {
00069 public:
00071   Stack();
00073   Stack(int n);
00075   Stack(const Stack<T> &s);
00077   virtual ~Stack();
00078 
00080   T pop();
00082   T peek() const;
00084   void push(T v);
00086   void clear();
00087 
00089   void operator=(const Stack<T> &s);
00090 
00092   int size() const { return ndata; }
00094   int no_elements() const { return valptr; }
00096   void set_size(int n, bool copy = false);
00097 
00098 private:
00099   int valptr;
00100   int ndata;
00101   T *data;
00102 
00103 private:
00104   void alloc(int n);
00105   void free();
00106 };
00107 
00108 // --------------------------- Implementation starts here ----------------------------------
00109 
00110 template<class T>
00111 Stack<T>::Stack()
00112 {
00113   data = 0;
00114   ndata = 0;
00115   valptr = 0;
00116 }
00117 
00118 template<class T>
00119 Stack<T>::Stack(int n)
00120 {
00121   alloc(n);
00122   valptr = 0;
00123 }
00124 
00125 template<class T>
00126 Stack<T>::Stack(const Stack<T> &s)
00127 {
00128   data = NULL;
00129   ndata = 0;
00130   valptr = s.valptr;
00131   alloc(s.ndata);
00132   for (int i = 0; i < s.ndata; i++)
00133     data[i] = s.data[i];
00134 }
00135 
00136 template<class T>
00137 Stack<T>::~Stack()
00138 {
00139   free();
00140 }
00141 
00142 template <class T>
00143 T Stack<T>::pop()
00144 {
00145   it_error_if(valptr == 0, "Stack<T>::pop: Empty stack");
00146   valptr--;
00147   return data[valptr];
00148 }
00149 
00150 template <class T>
00151 T Stack<T>::peek() const
00152 {
00153   it_error_if(valptr == 0, "Stack<T>::peek: Empty stack");
00154   return data[valptr-1];
00155 }
00156 
00157 template <class T>
00158 void Stack<T>::push(T v)
00159 {
00160   it_error_if(valptr >= ndata, "Stack<T>::push: Full stack");
00161   data[valptr] = v;
00162   valptr++;
00163 }
00164 
00165 template <class T>
00166 void Stack<T>::clear()
00167 {
00168   valptr = 0;
00169 }
00170 
00171 template<class T>
00172 void Stack<T>::alloc(int n)
00173 {
00174   if (n == 0) {
00175     data = NULL;
00176     ndata = 0;
00177   }
00178   else {
00179     data = new T[n];
00180     it_assert_debug(data != 0, "Out of memory in Stack::alloc");
00181   }
00182   ndata = n;
00183 }
00184 
00185 template<class T>
00186 void Stack<T>::free()
00187 {
00188 
00189   delete [] data;
00190 
00191   data = 0;
00192   ndata = 0;
00193 }
00194 
00195 template<class T>
00196 void Stack<T>::operator=(const Stack<T> &s)
00197 {
00198   set_size(s.ndata);
00199   for (int i = 0; i < ndata; i++)
00200     data[i] = s.data[i];
00201   valptr = 0;
00202 }
00203 
00204 template<class T>
00205 void Stack<T>::set_size(int sz, bool copy)
00206 {
00207   int i, min;
00208   T *tmp;
00209 
00210   if (ndata == sz)
00211     return;
00212 
00213   if (copy) {
00214     tmp = data;
00215     min = ndata < sz ? ndata : sz;
00216     alloc(sz);
00217     for (i = 0; i < min; i++)
00218       data[i] = tmp[i];
00219     delete [] tmp;
00220   }
00221   else {
00222     free();
00223     alloc(sz);
00224   }
00225   ndata = sz;
00226 }
00227 
00228 } // namespace itpp
00229 
00230 #endif // #ifndef STACK_H
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
SourceForge Logo

Generated on Tue Feb 2 09:33:29 2010 for IT++ by Doxygen 1.6.2