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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  b_queue.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_BQUEUE_H
  12. #define LEDA_BQUEUE_H
  13. //------------------------------------------------------------------------------
  14. // bounded queues
  15. //------------------------------------------------------------------------------
  16. #include <LEDA/basic.h>
  17. /*{Manpage {b_queue} {E} {Bounded Queues}}*/
  18. template<class E> 
  19. class b_queue  
  20. {
  21. /*{Mdefinition
  22. An instance $Q$ of the parameterized data type name is a queue
  23. (see section ref{Queues}) of bounded size.}*/
  24. E* first;     // first element of array
  25. E* stop;      // one position behind last element of array
  26. E* start;     // current start of queue (wraps around)
  27. E* end;       // one position behind end of queue (wraps around)
  28. public:
  29. /*{Mcreation Q}*/
  30. b_queue(int n) 
  31. {
  32. #if !defined(LEDA_CHECKING_OFF)
  33.   if (n<1) error_handler(88,"_b_queue: bad size");
  34. #endif
  35.   first = new E[n];
  36.   if (first==0) error_handler(88,"_b_queue: out of memory");
  37.   stop  = first+n;
  38.   start = end = first; 
  39. }
  40. /*{Mcreate creates an instance var of type name that can hold up to $n$ 
  41.            elements.  var is initialized with the empty queue.}*/
  42. virtual ~b_queue() { delete [] first; }
  43. /*{Moperations 2 5}*/
  44. E top() const
  45. {
  46. #if !defined(LEDA_CHECKING_OFF)
  47.   if (start==end) error_handler(88, "_b_queue empty");
  48. #endif
  49.   return *start;
  50. }
  51. /*{Mop  returns the front element of var.\
  52.          precond $Q$ is not empty.}*/
  53. E pop()
  54. {
  55. #if !defined(LEDA_CHECKING_OFF)
  56.  if (start==end) error_handler(88, "_b_queue underflow");
  57. #endif
  58.   E x = *start++;
  59.   if (start == stop) start = first;
  60.   return x;
  61. }
  62. /*{Mop  deletes and returns the front element of var.\
  63.          precond $Q$ is not empty.}*/
  64. void append(E& x)
  65. { *end++ = x;
  66.   if (end == stop) end = first;
  67. #if !defined(LEDA_CHECKING_OFF)
  68.   if (start==end) error_handler(88, "_b_queue overflow");
  69. #endif
  70. }
  71. /*{Mop   appends $x$ to the rear end of var.\
  72.   precond $Q$.size()$ < n$.}*/
  73. void clear() { start = end = first; }
  74. /*{Mop    makes var the empty queue.}*/
  75. int size() const 
  76. { int s = end-start;
  77.   return (s<0) ?  (stop-first+s) : s;
  78. }
  79. /*{Mop    returns the size of var.}*/
  80. bool empty() const { return (size()==0) ? true : false; }
  81. /*{Mop    returns true if var is empty, false otherwise.}*/
  82. };
  83. /*{Mimplementation
  84. Bounded queues are implemented by circular arrays. All operations take 
  85. time $O(1)$. The space requirement is $O(n)$.}*/
  86. #endif