Advertisement
prr133f

Stack/Queue/Deque

May 6th, 2024 (edited)
458
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.94 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include <iostream>
  4.  
  5. namespace structs {
  6. template <class T> class Stack {
  7. private:
  8.   T *__arr;
  9.   int __top;
  10.   uint __size;
  11.  
  12.   bool __needEvacuation() { return __top + 2 == __size; }
  13.  
  14.   void __evacuate() {
  15.     T *newArr = new T[__size * 2];
  16.     std::copy(__arr, __arr + __size, newArr);
  17.     delete[] __arr;
  18.     __arr = std::move(newArr);
  19.     __size *= 2;
  20.     return;
  21.   }
  22.  
  23. public:
  24.   Stack(uint size = 2) : __size(size) {
  25.     __top = -1;
  26.     __arr = new T[__size];
  27.   }
  28.  
  29.   ~Stack() { delete[] __arr; }
  30.  
  31.   bool IsEmpty() { return __top == -1; }
  32.  
  33.   void Push(T val) {
  34.     if (__needEvacuation()) {
  35.       __evacuate();
  36.     }
  37.  
  38.     __arr[++__top] = val;
  39.   }
  40.  
  41.   T Pop() {
  42.     if (IsEmpty()) {
  43.       std::cout << "Stack is empty" << std::endl;
  44.       return -1;
  45.     }
  46.  
  47.     return __arr[__top--];
  48.   }
  49. };
  50.  
  51. template <class T> class Queue {
  52. private:
  53.   T *__arr;
  54.   int __top;
  55.   uint __size;
  56.  
  57.   bool __needEvacuation() { return __top + 2 == __size; }
  58.  
  59.   void __evacuate() {
  60.     T *newArr = new T[__size * 2];
  61.     std::copy(__arr, __arr + __size, newArr);
  62.     delete[] __arr;
  63.     __arr = std::move(newArr);
  64.     __size *= 2;
  65.     return;
  66.   }
  67.  
  68. public:
  69.   Queue(uint size = 2) : __size(size) {
  70.     __top = -1;
  71.     __arr = new T[__size];
  72.   }
  73.  
  74.   ~Queue() { delete[] __arr; }
  75.  
  76.   bool IsEmpty() { return __top == -1; }
  77.  
  78.   void Push(T val) {
  79.     if (__needEvacuation()) {
  80.       __evacuate();
  81.     }
  82.  
  83.     __arr[++__top] = val;
  84.   }
  85.  
  86.   T Pop() {
  87.     if (IsEmpty()) {
  88.       std::cout << "Queue is empty" << std::endl;
  89.       return -1;
  90.     }
  91.  
  92.     T elem = __arr[0];
  93.  
  94.     std::copy(__arr + 1, __arr + __size, __arr);
  95.     --__size;
  96.     --__top;
  97.  
  98.     return elem;
  99.   }
  100. };
  101.  
  102. template <class T> class Deque {
  103. private:
  104.   T *__arr;
  105.   int __right;
  106.   uint __size;
  107.  
  108.   bool __needEvacuation() { return __right + 2 == __size; }
  109.  
  110.   void __evacuate() {
  111.     T *newArr = new T[__size * 2];
  112.     std::copy(__arr, __arr + __size, newArr);
  113.     delete[] __arr;
  114.     __arr = std::move(newArr);
  115.     __size *= 2;
  116.     return;
  117.   }
  118.  
  119. public:
  120.   Deque(uint size = 2) : __size(size) {
  121.     __right = -1;
  122.     __arr = new T[size];
  123.   }
  124.  
  125.   ~Deque() { delete[] __arr; }
  126.  
  127.   bool IsEmpty() { return __right == -1; }
  128.  
  129.   void PushLeft(T val) {
  130.     if (__needEvacuation()) {
  131.       __evacuate();
  132.     }
  133.  
  134.     std::copy(__arr, __arr + __size, __arr + 1);
  135.     __arr[0] = val;
  136.     __right++;
  137.   }
  138.  
  139.   void PushRight(T val) {
  140.     if (__needEvacuation()) {
  141.       __evacuate();
  142.     }
  143.  
  144.     __arr[++__right] = val;
  145.   }
  146.  
  147.   T PopLeft() {
  148.     if (IsEmpty()) {
  149.       std::cout << "Deque is empty" << std::endl;
  150.       return -1;
  151.     }
  152.  
  153.     T elem = __arr[0];
  154.     std::copy(__arr + 1, __arr + __size, __arr);
  155.     --__size;
  156.     --__right;
  157.  
  158.     return elem;
  159.   }
  160.  
  161.   T PopRight() {
  162.     if (IsEmpty()) {
  163.       std::cout << "Deque is empty" << std::endl;
  164.       return -1;
  165.     }
  166.  
  167.     return __arr[__right--];
  168.   }
  169. };
  170. } // namespace structs
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement