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
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 }
00228
00229 #endif // #ifndef STACK_H