Advertisement
Toliak

lab9

Dec 1st, 2018
337
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.92 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <iomanip>
  4. #include <cassert>
  5.  
  6. template<typename T>
  7. struct QueueNode
  8. {
  9.     explicit QueueNode(const T &value)
  10.         : value(value)
  11.     {}
  12.  
  13.     T value;
  14.     QueueNode *next = nullptr;
  15.     QueueNode *prev = nullptr;
  16. };
  17.  
  18. template<typename T>
  19. struct Queue
  20. {
  21.     void push(const T &value)
  22.     {
  23.         auto *newFirst = new QueueNode<T>(value);
  24.  
  25.         if (last == nullptr)
  26.             last = newFirst;
  27.  
  28.         if (first != nullptr)
  29.             first->prev = newFirst;     // Ликнуем
  30.         newFirst->next = first;         // Линкуем с предыдущим Nod'ом
  31.  
  32.         first = newFirst;               // Первый Node - первый
  33.     }
  34.     T pop()
  35.     {
  36.         assert(last != nullptr);
  37.  
  38.         T result = last->value;        // Копируем результат
  39.         QueueNode<T> *prev = last;     // Сохраняем бывший указатель
  40.         last = last->prev;            // Перемещаемся вперед
  41.  
  42.         delete prev;                    // Освобождаем память
  43.         return result;
  44.  
  45.     }
  46.     ~Queue()
  47.     {
  48.         while (last != nullptr) {
  49.             // Пока есть значения - удаляем их
  50.             pop();
  51.         }
  52.     }
  53.  
  54.     QueueNode<T> *first = nullptr;
  55.     QueueNode<T> *last = nullptr;
  56. };
  57.  
  58. int main()
  59. {
  60.     Queue<std::string> queue;
  61.  
  62.     size_t amount;
  63.     std::cout << "INPUT: " << std::endl;
  64.     std::cout << "Amount: ";
  65.     std::cin >> amount;
  66.     std::cin.ignore();
  67.  
  68.     for (size_t i = 0; i < amount; i++) {
  69.         std::string value;
  70.         std::cout << "[" << std::setw(2) << "] Value: ";
  71.         std::getline(std::cin, value);
  72.  
  73.         queue.push(value);
  74.     }
  75.  
  76.     std::cout << "OUTPUT: " << std::endl;
  77.     while (queue.last != nullptr) {
  78.         std::cout << queue.pop() << std::endl;
  79.     }
  80.  
  81.     return 0;
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement