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