Ladizzz

OOP Lab 6

Oct 22nd, 2021
677
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <cmath>
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. template <class T>
  8. class Stack_element {
  9.     T data;
  10. public:
  11.     Stack_element* next;
  12.     Stack_element(T new_data, Stack_element* new_next) : data(new_data), next(new_next) {};
  13.     int get_data()
  14.     {
  15.         return(data);
  16.     }
  17.     int set_data(T new_data)
  18.     {
  19.         data = new_data;
  20.     }
  21. };
  22.  
  23. template <class T>
  24. class Stack {
  25. private:
  26.     Stack_element<T>* head;
  27.     int length;
  28.     void set_length(int new_length) {
  29.         length = new_length;
  30.     }
  31. public:
  32.     Stack() : head(NULL) {}
  33.     Stack(T* arr, int size) {
  34.         for (int idx = 0; idx < size; idx++)
  35.             push(arr[idx]);
  36.     }
  37.  
  38.     T const& get_top() {
  39.         return head->get_data();
  40.     }
  41.  
  42.     int get_length() {
  43.         return length;
  44.     }
  45.  
  46.     Stack_element<T>* get_head() {
  47.         return head;
  48.     }
  49.  
  50.     void push(const T& data) {
  51.         Stack_element<T>* temp = new Stack_element<T>(data, nullptr);
  52.         if (head == nullptr) {
  53.             head = temp;
  54.         }
  55.         else {
  56.             temp->next = head;
  57.             head = temp;
  58.         }
  59.         set_length(get_length() + 1);
  60.     }
  61.  
  62.     T pop() {
  63.         int temp = head->get_data();
  64.         head = head->next;
  65.         set_length(get_length() - 1);
  66.         return temp;
  67.     }
  68.  
  69.     friend ostream& operator<<(ostream& stream, Stack obj) //перегрузка оператора вывода
  70.     {
  71.         int i = 1;
  72.         for (auto temp = obj.get_head(); temp != nullptr; temp = temp->next, i++)
  73.             cout << i << ") " << temp->get_data() << '\n';
  74.         return stream;
  75.     }
  76. };
  77.  
  78. template <class T>
  79. class Creator {
  80. public:
  81.     static Stack<T> create_stack(T* arr, int size) {
  82.         Stack<T> stack(arr, size);
  83.         return stack;
  84.     }
  85.  
  86.     static Stack<T> create_stack() {
  87.         Stack<T> stack;
  88.         stack.set_length(0);
  89.         return stack;
  90.     }
  91. };
  92.  
  93. int main() {
  94.     srand(static_cast<unsigned int>(time(0)));
  95.    
  96.     int min_num = 0, max_num = 99, n;
  97.     cout << "Enter a number of elements: ";
  98.     cin >> n;
  99.     int *arr = new int[n];
  100.     for (int idx = 0; idx < n; ++idx)
  101.         arr[idx] = min_num + rand() % max_num;
  102.    
  103.     cout << "Array: ";
  104.     for (int idx = 0; idx < n; idx++)
  105.         cout << arr[idx] << " ";
  106.     cout << "\n";
  107.    
  108.     Stack<int> stack = Creator<int>::create_stack(arr, n);
  109.     cout << stack;
  110. }
RAW Paste Data