Advertisement
Guest User

Untitled

a guest
Jun 18th, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.15 KB | None | 0 0
  1. #ifndef STACK_H_INCLUDED
  2. #define STACK_H_INCLUDED
  3.  
  4. #include <cstdlib>
  5. #include <stdexcept>
  6.  
  7. template <class T>
  8. class Stack {
  9. public:
  10.     T *data;
  11.     size_t sz;
  12.     size_t limit;
  13. private:
  14.  
  15.     Stack();
  16.     explicit Stack(size_t n);
  17.  
  18.     Stack(const Stack &other);
  19.     Stack& operator=(const Stack& other);
  20.  
  21.     Stack(Stack &&other);
  22.     Stack& operator=(Stack &&other);
  23.  
  24.     ~Stack();
  25.  
  26.     void Push(const T &val);
  27.     T& Pop();
  28. };
  29.  
  30. template <class T>
  31. Stack<T>::Stack() {
  32.     limit = 1;
  33.     data = new T[limit];
  34.     sz = 0;
  35. }
  36.  
  37. template <class T>
  38. Stack<T>::Stack(size_t n) {
  39.     limit = n;
  40.     data = new T[limit];
  41.     sz = n;
  42. }
  43.  
  44.  
  45. template <class T>
  46. Stack<T>::Stack(const Stack &other) {
  47.     limit = other.limit;
  48.     data = new T[limit];
  49.     sz = other.sz;
  50.     for (size_t i = 0; i != sz; ++i)
  51.         data[i] = other.data[i];
  52. }
  53.  
  54.  
  55. template <class T>
  56. Stack<T>& Stack<T>::operator=(const Stack &other) {
  57.     if (&other != this) {
  58.         delete[] data;
  59.  
  60.         limit = other.limit;
  61.         data = new T[limit];
  62.         sz = other.sz;
  63.         for (size_t i = 0; i != sz; ++i)
  64.             data[i] = other.data[i];
  65.     }
  66.  
  67.     return *this;
  68. }
  69.  
  70. template <class T>
  71. Stack<T>::Stack(Stack &&other) {
  72.     limit = other.limit;
  73.     data = other.data;
  74.     sz = other.sz;
  75.  
  76.     other.data = nullptr;
  77. }
  78.  
  79.  
  80. template <class T>
  81. Stack<T>& Stack<T>::operator=(Stack &&other) {
  82.     if (&other != this) {
  83.         delete[] data;
  84.  
  85.         limit = other.limit;
  86.         data = other.data;
  87.         sz = other.sz;
  88.  
  89.         other.data = nullptr;
  90.     }
  91.  
  92.     return *this;
  93. }
  94.  
  95. template <class T>
  96. Stack<T>::~Stack() {
  97.     delete[] data;
  98. }
  99.  
  100. template <class T>
  101. void Stack<T>::Push(const T &val) {
  102.     if (sz == limit || limit = 0) {
  103.         T *newData = new T[limit * 2];
  104.         limit *= 2;
  105.  
  106.         for (size_t i = 0; i != sz; ++i)
  107.             newData[i] = data[i];
  108.  
  109.         delete[] data;
  110.         data = newData;
  111.     }
  112.  
  113.     data[sz++] = val;
  114. }
  115.  
  116. template <class T>
  117. T& Stack<T>::Pop() {
  118.     if (sz == 0)
  119.         throw std::underflow_error("stack underflow");
  120.  
  121.     return data[--sz];
  122. }
  123.  
  124.  
  125.  
  126. #endif // STACK_H_INCLUDED
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement