jeanleopoldo

LinkedQueue

Apr 28th, 2017
36
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.19 KB | None | 0 0
  1. //  Copyright [2017] <Jean Leopoldo>
  2. #ifndef STRUCTURES_LINKED_QUEUE_H
  3. #define STRUCTURES_LINKED_QUEUE_H
  4.  
  5. #include <cstdint>
  6. #include <stdexcept>
  7.  
  8. namespace structures {
  9.  
  10. template<typename T>
  11. //! class LinkedQueue
  12. /*
  13. *  class LinkedQueue
  14. */
  15. class LinkedQueue {
  16.  public:
  17. //! constructor LinkedQueue
  18. /*
  19. *  constructor LinkedQueue
  20. */
  21.     LinkedQueue() {
  22.         head = nullptr;
  23.         tail = nullptr;
  24.         size_ = 0;
  25.     }
  26. //! destructor LinkedQueue
  27. /*
  28. *  destructor LinkedQueue
  29. */
  30.     ~LinkedQueue() {
  31.         clear();
  32.     }
  33. //! clear
  34. /*
  35. *  clear list
  36. */
  37.     void clear() {
  38.         Node *aux;
  39.         while (!empty()) {
  40.             aux = head;
  41.             head = head->next();
  42.             delete aux;
  43.         }
  44.         size_ = 0;
  45.         head = nullptr;
  46.         tail = nullptr;
  47.     }
  48. //! enqueue
  49. /*
  50. *  insert node at the beginning of the queue
  51. */
  52.     void enqueue(const T& data) {
  53.         Node *node = new Node(data);
  54.         if (node == nullptr)
  55.             throw std::out_of_range("full");
  56.         if (empty()) {
  57.             size_++;
  58.             head = node;
  59.             tail = node;
  60.         } else {
  61.             size_++;
  62.             head = node;
  63.         }
  64.     }
  65. //! dequeue
  66. /*
  67. *  remove node from the end of the queue and return its data
  68. */
  69.     T dequeue() {
  70.         if (empty())
  71.             throw std::out_of_range("empty");
  72.         if (size_ == 1) {
  73.             T data = head->data();
  74.             size_--;
  75.             head = nullptr;
  76.             tail = nullptr;
  77.             return data;
  78.         }
  79.         size_--;
  80.         Node *aux = head;
  81.         T data = tail->data();
  82.         for (int i = 0; i < size_-2; i++)
  83.             aux = aux->next();
  84.         aux->next(nullptr);
  85.         tail->next(aux);
  86.         return data;
  87.     }
  88. //! front
  89. /*
  90. *  returns data of the first node
  91. */
  92.     T& front() const {
  93.         if (empty())
  94.             throw std::out_of_range("empty");
  95.         return head->data();
  96.     }
  97. //! back
  98. /*
  99. *  returns data of the last node
  100. */
  101.     T& back() const {
  102.         if (empty())
  103.             throw std::out_of_range("empty");
  104.         return tail->data();
  105.     }
  106. //! empty
  107. /*
  108. *  checks if queue is empty
  109. */
  110.     bool empty() const {
  111.         if (size_ == 0)
  112.             return true;
  113.         return false;
  114.     }
  115. //! size
  116. /*
  117. *  returns size of the queue
  118. */
  119.     std::size_t size() const {
  120.         return size_;
  121.     }
  122.  
  123.  private:
  124.     class Node {
  125.      public:
  126.         explicit Node(const T& data) {
  127.             data_ = data;
  128.             next_ = nullptr;
  129.         }
  130.         Node(const T& data, Node* next) {
  131.             data_ = data;
  132.             next_ = next;
  133.         }
  134.         T& data() {
  135.             return data_;
  136.         }
  137.         const T& data() const {
  138.             return data_;
  139.         }
  140.  
  141.         Node* next() {
  142.             return next_;
  143.         }
  144.         const Node* next() const {
  145.             return next_;
  146.         }
  147.  
  148.         void next(Node* node) {
  149.             next_ = node;
  150.         }
  151.  
  152.      private:
  153.         T data_;
  154.         Node* next_;
  155.     };
  156.     Node* head;  //  nodo-cabeça
  157.     Node* tail;  //  nodo-fim
  158.     std::size_t size_;  //  tamanho
  159. };
  160.  
  161. }  //  namespace structures
  162.  
  163. #endif
Add Comment
Please, Sign In to add comment