Advertisement
Yakov

Park.2018.Autumn.Queue

Sep 29th, 2018
310
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.57 KB | None | 0 0
  1. #include <cassert>
  2. #include <iostream>
  3.  
  4. ///////////////////////////////////////////////////////////////
  5. // Queue.h
  6.  
  7. class Queue {
  8. public:
  9.     Queue() = default;
  10.     Queue(const Queue& other) = delete;
  11.     Queue(Queue&& other) { *this = std::move(other); }
  12.     ~Queue();
  13.  
  14.     Queue& operator=(const Queue& other) = delete;
  15.     Queue& operator=(Queue&& other);
  16.    
  17.     Queue MakeCopy() const;
  18.  
  19.     void Push(int value);
  20.     int Pop();
  21.  
  22.     bool IsEmpty() const { return !head; }
  23.  
  24. private:
  25.     struct Node;
  26.  
  27.     Node* head = nullptr;
  28.     Node* tail = nullptr;
  29.  
  30.     void clean();
  31. };
  32.  
  33. ////////////////////////////////////////////////////////////////////////
  34. // Queue.cpp
  35.  
  36. struct Queue::Node {
  37.     int Value = 0;
  38.     Node* Next = nullptr;
  39.  
  40.     Node() = default;
  41.     Node(int value) : Value(value) {}
  42. };
  43.  
  44. Queue::~Queue()
  45. {
  46.     clean();
  47. }
  48.  
  49. Queue& Queue::operator=(Queue&& queue)
  50. {
  51.     clean();
  52.  
  53.     std::swap(head, queue.head);
  54.     std::swap(tail, queue.tail);
  55.  
  56.     return *this;
  57. }
  58.  
  59. void Queue::clean()
  60. {
  61.     while (head) {
  62.         Node* node = head;
  63.         head = head->Next;
  64.         delete node;
  65.     }
  66.  
  67.     tail = nullptr;
  68. }
  69.  
  70. Queue Queue::MakeCopy() const
  71. {
  72.     Queue copy;
  73.     Node* node = head;
  74.     while (node) {
  75.         copy.Push(node->Value);
  76.         node = node->Next;
  77.     }
  78.  
  79.     return copy;
  80. }
  81.  
  82. void Queue::Push(int value)
  83. {
  84.     Node* node = new Node(value);
  85.  
  86.     if (IsEmpty()) {
  87.         head = tail = node;
  88.         return;
  89.     }
  90.  
  91.     tail->Next = node;
  92.     tail = node;
  93. }
  94.  
  95. int Queue::Pop()
  96. {
  97.     assert(!IsEmpty());
  98.  
  99.     int result = head->Value;
  100.  
  101.     Node* node = head;
  102.     if (head != tail) {
  103.         head = head->Next;
  104.     } else {
  105.         head = tail = nullptr;
  106.     }
  107.  
  108.     delete node;
  109.     return result;
  110. }
  111.  
  112. Queue create_queue()
  113. {
  114.     Queue queue;
  115.     queue.Push(3);
  116.     queue.Push(4);
  117.     queue.Push(5);
  118.  
  119.     return queue;
  120. }
  121.  
  122. void test()
  123. {
  124.     auto queue = create_queue();
  125.  
  126.     assert(queue.Pop() == 3);
  127.     assert(queue.Pop() == 4);
  128.     assert(!queue.IsEmpty());
  129.     assert(queue.Pop() == 5);
  130.     assert(queue.IsEmpty());
  131. }
  132.  
  133.  
  134. //////////////////////////////////////////////////////////////////
  135. //main.cpp
  136.  
  137. struct Operation {
  138.     int Code = 0;
  139.     int Value = 0;
  140. };
  141.  
  142. bool do_operation(Queue& queue, Operation op)
  143. {
  144.     switch (op.Code) {
  145.     case 3:
  146.         queue.Push(op.Value);
  147.         return true;
  148.     case 2: {
  149.             const int result = !queue.IsEmpty() ? queue.Pop() : -1;
  150.             return result == op.Value;
  151.         }
  152.     }
  153.  
  154.     assert(false);
  155.     return false;
  156. }
  157.  
  158. int main()
  159. {
  160.     int n = 0;
  161.     std::cin >> n;
  162.  
  163.     Queue queue;
  164.     for (int i = 0; i < n; i++) {
  165.         Operation op;
  166.         std::cin >> op.Code >> op.Value;
  167.         if (!do_operation(queue, op)) {
  168.             std::cout << "NO";
  169.             return 0;
  170.         }
  171.     }
  172.  
  173.     std::cout << "YES";
  174.  
  175.     return 0;
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement