Advertisement
CyberN00b

queue with clown sort

Dec 24th, 2022 (edited)
1,417
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.67 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. namespace my_namespace {
  6.  
  7.     class queue_empty_exception : public exception {
  8.     public:
  9.         char *what() const throw() {
  10.             return "Error: Queue is empty!";
  11.         }
  12.     };
  13.  
  14.     template<typename T>
  15.     struct queue {
  16.  
  17.         queue() : queue_size(0) {}
  18.  
  19.         ~queue() {
  20.             clear();
  21.         }
  22.  
  23.         void clear() {
  24.             for (node *it = begin; it != nullptr; begin = it) {
  25.                 it = begin->next;
  26.                 delete begin;
  27.             }
  28.             queue_size = 0;
  29.         }
  30.  
  31.         void push(T value) {
  32.             if (!queue_size) {
  33.                 end = new node(value);
  34.                 begin = end;
  35.             } else {
  36.                 end->next = new node(value);
  37.                 end = end->next;
  38.             }
  39.             ++queue_size;
  40.         }
  41.  
  42.         void pop() {
  43.             if (!queue_size) {
  44.                 throw queue_empty_exception();
  45.             }
  46.             --queue_size;
  47.             node *next = begin->next;
  48.             delete begin;
  49.             begin = next;
  50.         }
  51.  
  52.         T front() {
  53.             if (!queue_size) {
  54.                 throw queue_empty_exception();
  55.             }
  56.             return begin->value;
  57.         }
  58.  
  59.         bool empty() {
  60.             return queue_size <= 0;
  61.         }
  62.  
  63.         size_t size() {
  64.             return queue_size;
  65.         }
  66.  
  67.     private:
  68.  
  69.         struct node {
  70.             T value;
  71.             node *next;
  72.  
  73.             node(T value, node *next = nullptr) : value(value), next(next) {}
  74.         };
  75.  
  76.         size_t queue_size;
  77.         node *begin = nullptr;
  78.         node *end = nullptr;
  79.  
  80.     };
  81.  
  82.     template<typename T>
  83.     void shift_queue(size_t count, queue<T> &q) {
  84.         for (size_t i = 0; i < count; ++i) {
  85.             q.push(q.front());
  86.             q.pop();
  87.         }
  88.     }
  89.  
  90.  
  91.     template<typename T>
  92.     ostream &operator<<(ostream &os, queue<T> &q) {
  93.         for (size_t i = 0; i < q.size(); ++i) {
  94.             os << q.front() << ' ';
  95.             q.push(q.front());
  96.             q.pop();
  97.         }
  98.         return os;
  99.     }
  100.  
  101.     void sort(size_t l, size_t r, queue<int> &q) {
  102.         size_t size = q.size(), mid_index = (r + l) / 2;
  103.         shift_queue(mid_index, q);
  104.         queue<int> less_q, equal_q, greater_q;
  105.         int mid_value = q.front();
  106.         equal_q.push(mid_value);
  107.         q.pop();
  108.         for (size_t i = 0; i < r - mid_index - 1; ++i) {
  109.             if (q.front() > mid_value)
  110.                 greater_q.push(q.front());
  111.             else if (q.front() < mid_value)
  112.                 less_q.push(q.front());
  113.             else
  114.                 equal_q.push(q.front());
  115.             q.pop();
  116.         }
  117.         shift_queue(size - r + l, q);
  118.         for (size_t i = 0; i < mid_index - l; ++i) {
  119.             if (q.front() > mid_value)
  120.                 greater_q.push(q.front());
  121.             else if (q.front() < mid_value)
  122.                 less_q.push(q.front());
  123.             else
  124.                 equal_q.push(q.front());
  125.             q.pop();
  126.         }
  127.         shift_queue(size - r + l, q);
  128.         size_t l_size = less_q.size(), g_size = greater_q.size();
  129.         for (; !less_q.empty();) {
  130.             q.push(less_q.front());
  131.             less_q.pop();
  132.         }
  133.         for (; !equal_q.empty();) {
  134.             q.push(equal_q.front());
  135.             equal_q.pop();
  136.         }
  137.         for (; !greater_q.empty();) {
  138.             q.push(greater_q.front());
  139.             greater_q.pop();
  140.         }
  141.         shift_queue(size - r, q);
  142.         if (g_size > 1)
  143.             sort(r - g_size, r, q);
  144.         if (l_size > 1)
  145.             sort(l, l + l_size, q);
  146.     }
  147. }
  148.  
  149. int main() {
  150.     my_namespace::queue<int> q;
  151.     while (true) {
  152.         int a;
  153.         cin >> a;
  154.         if (a == -1)
  155.             break;
  156.         else if (a == 1) {
  157.             int b;
  158.             cin >> b;
  159.             q.push(b);
  160.         } else if (a == 2) {
  161.             try {
  162.                 q.pop();
  163.             } catch (exception& e) {
  164.                 cout << e.what() << endl;
  165.             }
  166.         } else if (a == 3) {
  167.             try {
  168.                 cout << q.front() << endl;
  169.             } catch (my_namespace::queue_empty_exception& e) {
  170.                 cout << e.what() << endl;
  171.             }
  172.         } else if (a == 4) {
  173.             q.clear();
  174.         } else if (a == 5) {
  175.             cout << q << endl;
  176.             my_namespace::sort(0, q.size(), q);
  177.             cout << q << endl;
  178.         } else if (a == 6) {
  179.             int b;
  180.             cin >> b;
  181.             for (int i = 0; i < b; ++i) {
  182.                 q.push(rand() % 1000);
  183.             }
  184.         }
  185.     }
  186. }
  187.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement