Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <iomanip>
- #include <cassert>
- template<typename T>
- struct QueueNode
- {
- explicit QueueNode(const T &value)
- : value(value)
- {}
- T value;
- QueueNode *next = nullptr;
- QueueNode *prev = nullptr;
- };
- template<typename T>
- struct Queue
- {
- void push(const T &value)
- {
- auto *newFirst = new QueueNode<T>(value);
- if (last == nullptr)
- last = newFirst;
- if (first != nullptr)
- first->prev = newFirst; // Ликнуем
- newFirst->next = first; // Линкуем с предыдущим Nod'ом
- first = newFirst; // Первый Node - первый
- }
- T pop()
- {
- assert(last != nullptr);
- T result = last->value; // Копируем результат
- QueueNode<T> *prev = last; // Сохраняем бывший указатель
- last = last->prev; // Перемещаемся вперед
- delete prev; // Освобождаем память
- return result;
- }
- ~Queue()
- {
- while (last != nullptr) {
- // Пока есть значения - удаляем их
- pop();
- }
- }
- QueueNode<T> *first = nullptr;
- QueueNode<T> *last = nullptr;
- };
- int main()
- {
- Queue<std::string> queue;
- size_t amount;
- std::cout << "INPUT: " << std::endl;
- std::cout << "Amount: ";
- std::cin >> amount;
- std::cin.ignore();
- for (size_t i = 0; i < amount; i++) {
- std::string value;
- std::cout << "[" << std::setw(2) << "] Value: ";
- std::getline(std::cin, value);
- queue.push(value);
- }
- std::cout << "OUTPUT: " << std::endl;
- while (queue.last != nullptr) {
- std::cout << queue.pop() << std::endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement