b_stack.h
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:2k
开发平台:

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  b_stack.h
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #ifndef LEDA_BSTACK_H
  12. #define LEDA_BSTACK_H
  13. //------------------------------------------------------------------------------
  14. // bounded stacks 
  15. //------------------------------------------------------------------------------
  16. #include <LEDA/basic.h>
  17. /*{Manpage {b_stack} {E} {Bounded Stacks}}*/
  18. template<class E> 
  19. class b_stack
  20. {
  21. /*{Mdefinition
  22. An instance $S$ of the parameterized data type name is a stack
  23. (see section ref{Stacks}) of bounded size.}*/
  24. E* first;  // start of array
  25. E* stop;   // one position behind last element
  26. E* free;   // pointer to first free element
  27. public:
  28. /*{Mcreation S }*/
  29. b_stack(int n)
  30. {
  31. #if !defined(LEDA_CHECKING_OFF)
  32.   if (n<1) error_handler(99,"bounded stack: bad size");
  33. #endif
  34.   free = first = new E[n];
  35.   stop = first + n;
  36.   if (first==0) error_handler(99,"bounded stack: out of memory");
  37.  }
  38. /*{Mcreate creates an instance var of type name that can hold up to $n$ 
  39.             elements.  var is initialized with the empty stack.}*/
  40. virtual ~b_stack() { delete [] first; }
  41. /*{Moperations 2 4}*/
  42. E top() const
  43. {
  44. #if !defined(LEDA_CHECKING_OFF)
  45.   if (free==first) error_handler(99,"bounded stack: empty");
  46. #endif
  47.   return *(free-1);
  48.   }
  49. /*{Mop     returns the top element of var.\
  50.     precond $S$ is not empty.}*/
  51. E pop()
  52. {
  53. #if !defined(LEDA_CHECKING_OFF)
  54.   if (free==first) error_handler(99,"b_stack underflow");
  55. #endif
  56. return *--free;
  57. }
  58. /*{Mop   deletes and returns the top element of var.\
  59.   precond $S$ is not empty.}*/
  60. void push(const E& x)
  61. {
  62. #if !defined(LEDA_CHECKING_OFF)
  63.   if (free==stop) error_handler(99,"bounded stack: overflow");
  64. #endif
  65.   *free++ = x;
  66. }
  67. /*{Mop  adds $x$ as new top element to var.\
  68.  precond $S$.size() $< n$.}*/
  69. void clear() { free = first; }
  70. /*{Mop   makes var the empty stack.}*/
  71. int   size()  const { return free - first; }
  72. /*{Mop    returns the size of var.}*/
  73. bool   empty() const { return (free==first) ? true : false; }
  74. /*{Mop  returns true if var is empty, false otherwise.}*/
  75. };
  76. /*{Mimplementation
  77. Bounded stacks are implemented by CC vectors. All operations take
  78. time $O(1)$. The space requirement is $O(n)$.}*/
  79. #endif