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
Generated on Fri May 1 11:09:16 2009 for IT++ by Doxygen 1.5.8