Aleph-w  1.5a.2
Biblioteca general de algoritmos y estructuras de datos
 Todo Clases Archivos Funciones Variables 'typedefs' Enumeraciones Amigas Grupos Páginas
tpl_arrayStack.H
1 
2 # ifndef TPL_ARRAYSTACK_H
3 # define TPL_ARRAYSTACK_H
4 
5 # include <iostream>
6 # include <aleph.H>
7 # include <tpl_memArray.H>
8 
9 using namespace std;
10 
11 using namespace Aleph;
12 
13 namespace Aleph {
14 
41  template <typename T>
43 {
44  MemArray<T> array;
45 
46 public:
47 
48  ArrayStack(size_t dim = 8) : array(dim) { /* empty */ }
49 
50  ArrayStack(const ArrayStack & s) : array(s.array) { /* empty */ }
51 
52  ArrayStack(ArrayStack && s) : array(std::move(s.array)) { /* empty */ }
53 
54  ArrayStack & operator = (const ArrayStack & s)
55  {
56  if (this == &s)
57  return *this;
58 
59  array = s.array;
60 
61  return *this;
62  }
63 
64  void swap(ArrayStack & s)
65  {
66  std::swap(*this, s);
67  }
68 
69  ArrayStack & operator = (ArrayStack && s)
70  {
71  array.swap(s.array);
72  return *this;
73  }
74 
84  T & push(const T & data) throw(std::exception, std::overflow_error)
85  {
86  return array.put(data);
87  }
88 
89  T & push(T && data) throw(std::exception, std::overflow_error)
90  {
91  return array.put(std::move(data));
92  }
93 
106  T & pushn(const size_t & n = 1) throw(std::exception, std::overflow_error)
107  {
108  array.putn(n);
109  return array.last();
110  }
111 
119  T pop() throw(std::exception, std::underflow_error)
120  {
121  return array.get(1);
122  }
123 
134  T popn(const int & n) throw(std::exception, std::underflow_error)
135  {
136  return array.get(n);
137  }
138 
140  T & top() throw(std::exception,std::underflow_error)
141  {
142  return array.last();
143  }
144 
145  T & base()
146  {
147  return array.first();
148  }
149 
150  const T & top() const throw(std::exception,std::underflow_error)
151  {
152  return array.last();
153  }
154 
167  T & top(const int & i) throw(std::exception, std::underflow_error)
168  {
169  return array.access(array.size() - i - 1);
170  }
171 
172  const T & top(const int & i) const throw(std::exception, std::underflow_error)
173  {
174  return array.access(array.size() - i - 1);
175  }
176 
178  void empty() { array.empty(); }
179 
181  bool is_empty() const { return array.size() == 0; }
182 
184  const size_t & size() const { return array.size(); }
185 
186  const size_t & capacity() const { return array.capacity(); }
187 
188  template <class Operation>
189  bool traverse(Operation & operation)
190  {
191  return array.traverse(operation);
192  }
193 
194  template <class Operation>
195  bool traverse(Operation & operation) const
196  {
197  return array.traverse(operation);
198  }
199 
200  template <class Operation>
201  bool traverse(Operation && operation = Operation()) const
202  {
203  return array.traverse(operation);
204  }
205 
206  template <class Operation>
207  bool traverse(Operation && operation = Operation())
208  {
209  return array.traverse(operation);
210  }
211 
212  Functional_Methods(T);
213 
214  Generic_Items(T);
215 };
216 
242  template <typename T>
244 {
245  T * array = NULL;
246  size_t head;
247  size_t dim;
248 
249 public:
250 
252  FixedStack(size_t d = 512)
253  : array(new T [d]), head(0), dim(d) { /* empty */ }
254 
255  ~FixedStack()
256  {
257  if (array)
258  delete [] array;
259  }
260 
261  FixedStack(const FixedStack & s)
262  : array(new T [s.dim]), head(s.head), dim(s.dim)
263  {
264  for (int i = 0; i < head; ++i)
265  array[i] = s.array[i];
266  }
267 
268  void swap(FixedStack & s)
269  {
270  std::swap(array, s.array);
271  std::swap(head, s.head);
272  std::swap(dim, s.dim);
273  }
274 
275  FixedStack(FixedStack && s)
276  : array(NULL), head(0), dim(0)
277  {
278  swap(s);
279  }
280 
281  FixedStack & operator = (const FixedStack & s)
282  {
283  if (this == &s)
284  return *this;
285 
286  T * ptr = new T [s.dim];
287  if (array)
288  delete [] array;
289  array = ptr;
290  for (size_t i = 0; i < s.head; ++i)
291  array[i] = s.array[i];
292  head = s.head;
293  dim = s.dim;
294 
295  return *this;
296  }
297 
298  FixedStack & operator = (FixedStack && s)
299  {
300  swap(s);
301  return *this;
302  }
303 
312  T & push(const T & data)
313  {
314  I(head < dim );
315 
316  array[head++] = data;
317  return array[head - 1];
318  }
319 
320  T & push(T && data)
321  {
322  I(head < dim );
323 
324  std::swap(array[head++], data);
325  return array[head - 1];
326  }
327 
339  T & pushn(const size_t & n = 1)
340  {
341  I(head + n <= dim);
342 
343  head += n;
344  return array[head - 1];
345  }
346 
353  T pop()
354  {
355  I(head > 0);
356 
357  return std::move(array[--head]);
358  }
359 
369  T popn(const int & n)
370  {
371  I((int (head - n)) >= 0);
372 
373  head -= n;
374  return std::move(array[head]);
375  }
376 
378  T & top()
379  {
380  I(head > 0);
381 
382  return array[head - 1];
383  }
384 
385  T & top() const
386  {
387  I(head > 0);
388 
389  return array[head - 1];
390  }
391 
392  T & base() { return array[0]; }
393 
404  T & top(const int & i)
405 
406  {
407  I(i < head);
408 
409  return array[head - i - 1];
410  }
411 
413  bool is_empty() const { return head == 0; }
414 
416  void empty() { head = 0; }
417 
419  const size_t & size() const { return head; }
420 
421  template <class Operation>
422  bool traverse(Operation & operation)
423  {
424  for (int i = 0; i < head; i++)
425  if (not operation(array[i]))
426  return false;
427 
428  return true;
429  }
430 
431  template <class Operation>
432  bool traverse(Operation & operation) const
433  {
434  return const_cast<FixedStack*>(this)->traverse(operation);
435  }
436 
437  template <class Operation>
438  bool traverse(Operation && operation = Operation()) const
439  {
440  return traverse<Operation>(operation);
441  }
442 
443  template <class Operation>
444  bool traverse(Operation && operation = Operation())
445  {
446  return traverse<Operation>(operation);
447  }
448 
449  Functional_Methods(T);
450 
451  Generic_Items(T);
452 };
453 
454 } // end namespace Aleph
455 
456 # endif /* TPL_ARRAYSTACK_H */
457 
Definition: tpl_memArray.H:17
bool is_empty() const
Retorna true si la pila está vacía.
Definition: tpl_arrayStack.H:413
T & top(const int &i)
Definition: tpl_arrayStack.H:404
T pop()
Definition: tpl_arrayStack.H:353
void empty()
Vacía todos los elementos de la pila.
Definition: tpl_arrayStack.H:178
T & top()
retorna una referencia al elemento situado en el tope de la pila.
Definition: tpl_arrayStack.H:140
T & top(const int &i)
Definition: tpl_arrayStack.H:167
Definition: tpl_arrayStack.H:42
T & push(const T &data)
Definition: tpl_arrayStack.H:312
const size_t & size() const
Retorna el número de elementos que contiene la pila.
Definition: tpl_arrayStack.H:184
const size_t & size() const
Retorna el número de elementos que contiene la pila.
Definition: tpl_arrayStack.H:419
T popn(const int &n)
Definition: tpl_arrayStack.H:369
T & push(const T &data)
Definition: tpl_arrayStack.H:84
T & pushn(const size_t &n=1)
Definition: tpl_arrayStack.H:339
Definition: tpl_arrayStack.H:243
T pop()
Definition: tpl_arrayStack.H:119
FixedStack(size_t d=512)
Constructor.
Definition: tpl_arrayStack.H:252
T & pushn(const size_t &n=1)
Definition: tpl_arrayStack.H:106
T popn(const int &n)
Definition: tpl_arrayStack.H:134
T & top()
retorna una referencia al elemento situado en el tope de la pila.
Definition: tpl_arrayStack.H:378
bool is_empty() const
Retorna true si la pila está vacía.
Definition: tpl_arrayStack.H:181
void empty()
Vacía todos los elementos de la pila.
Definition: tpl_arrayStack.H:416

Leandro Rabindranath León