1
0

queuetp.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. // queuetp.h -- queue template with a nested class
  2. #ifndef QUEUETP_H_
  3. #define QUEUETP_H_
  4. template <class Item>
  5. class QueueTP
  6. {
  7. private:
  8. enum {Q_SIZE = 10};
  9. // Node is a nested class definition
  10. class Node
  11. {
  12. public:
  13. Item item;
  14. Node * next;
  15. Node(const Item & i):item(i), next(0){ }
  16. };
  17. Node * front; // pointer to front of Queue
  18. Node * rear; // pointer to rear of Queue
  19. int items; // current number of items in Queue
  20. const int qsize; // maximum number of items in Queue
  21. QueueTP(const QueueTP & q) : qsize(0) {}
  22. QueueTP & operator=(const QueueTP & q) { return *this; }
  23. public:
  24. QueueTP(int qs = Q_SIZE);
  25. ~QueueTP();
  26. bool isempty() const
  27. {
  28. return items == 0;
  29. }
  30. bool isfull() const
  31. {
  32. return items == qsize;
  33. }
  34. int queuecount() const
  35. {
  36. return items;
  37. }
  38. bool enqueue(const Item &item); // add item to end
  39. bool dequeue(Item &item); // remove item from front
  40. };
  41. // QueueTP methods
  42. template <class Item>
  43. QueueTP<Item>::QueueTP(int qs) : qsize(qs)
  44. {
  45. front = rear = 0;
  46. items = 0;
  47. }
  48. template <class Item>
  49. QueueTP<Item>::~QueueTP()
  50. {
  51. Node * temp;
  52. while (front != 0) // while queue is not yet empty
  53. {
  54. temp = front; // save address of front item
  55. front = front->next;// reset pointer to next item
  56. delete temp; // delete former front
  57. }
  58. }
  59. // Add item to queue
  60. template <class Item>
  61. bool QueueTP<Item>::enqueue(const Item & item)
  62. {
  63. if (isfull())
  64. return false;
  65. Node * add = new Node(item); // create node
  66. // on failure, new throws std::bad_alloc exception
  67. items++;
  68. if (front == 0) // if queue is empty,
  69. front = add; // place item at front
  70. else
  71. rear->next = add; // else place at rear
  72. rear = add; // have rear point to new node
  73. return true;
  74. }
  75. // Place front item into item variable and remove from queue
  76. template <class Item>
  77. bool QueueTP<Item>::dequeue(Item & item)
  78. {
  79. if (front == 0)
  80. return false;
  81. item = front->item; // set item to first item in queue
  82. items--;
  83. Node * temp = front; // save location of first item
  84. front = front->next; // reset front to next item
  85. delete temp; // delete former first item
  86. if (items == 0)
  87. rear = 0;
  88. return true;
  89. }
  90. #endif