Advertisement
VictoriaLodochkina

labb 4

Nov 5th, 2020
669
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.81 KB | None | 0 0
  1. #pragma once
  2. #include <iostream>
  3. #include <conio.h>
  4. using namespace std;
  5. template <class T>
  6. class Node
  7. {
  8.     Node* next;
  9.     T data;
  10.     template <typename U>
  11.     friend class Stack;
  12. };
  13.  
  14.  
  15. template <class T>
  16. class Stack
  17. {
  18. private:
  19.     Node<T>* pTop;
  20.  
  21. public:
  22.    
  23.     Stack() { pTop = nullptr; }
  24.  
  25.     Stack(Node<T>* SL)            
  26.     {
  27.         if (SL == nullptr)
  28.         {
  29.             pTop = nullptr;
  30.             return;
  31.         }
  32.         this->pTop = SL;    
  33.         this->next = nullptr;
  34.     }
  35.  
  36.    
  37.     Stack(const Stack& SL)
  38.     {
  39.         Node<T>* p; // дополнительные указатели
  40.         Node<T>* p2;
  41.         Node<T>* p3;
  42.  
  43.        
  44.         pTop = nullptr;
  45.         p3 = nullptr;
  46.  
  47.         p = SL.pTop; // указатель p движется по списку SL.pTop->...
  48.         while (p != nullptr)
  49.         {
  50.             // 1. Сформировать узел p2
  51.             try {
  52.                 // попытка выделения памяти
  53.                 p2 = new Node<T>;
  54.             }
  55.             catch (bad_alloc e)
  56.             {
  57.                 // если память не выделена, то выход
  58.                 cout << e.what() << endl;
  59.                 return;
  60.             }
  61.             p2->data = p->data;//********
  62.             p2->next = nullptr;
  63.  
  64.             // 2. pTop = pTop + p2
  65.             if (pTop == nullptr) // создать очередь
  66.             {
  67.                 pTop = p2;
  68.                 p3 = p2;
  69.             }
  70.             else
  71.             {
  72.                 p3->next = p2;
  73.                 p3 = p3->next;
  74.             }
  75.  
  76.             // 3. Перейти на следующий элемент
  77.             p = p->next;
  78.         }
  79.     }
  80.  
  81.  
  82.     void Push(T data)
  83.     {
  84.         Node<T>* p;
  85.  
  86.         //  Сформировать элемент
  87.         try {
  88.             p = new Node<T>; // попытка выделить память
  89.         }
  90.         catch (bad_alloc e)
  91.         {
  92.             // если память не выделилась, то выход
  93.             cout << e.what() << endl;
  94.             return;
  95.         }
  96.         p->data = data;//****************
  97.         p->next = pTop; // p указывает на 1-й элемент
  98.  
  99.         // 2. Перенаправить pTop на p
  100.         pTop = p;
  101.     }
  102.  
  103.     // Количество элементов в стеке
  104.     /*int Count()
  105.     {
  106.         if (pTop == nullptr)
  107.             return 0;
  108.         else
  109.         {
  110.             Node<T>* p = pTop;
  111.             int count = 0;
  112.  
  113.             while (p != nullptr)
  114.             {
  115.                 count++;
  116.                 p = p->next;
  117.             }
  118.         }
  119.     }*/
  120.  
  121.     // очищает стек - удаляет все элементы из стека
  122.     void Empty()
  123.     {
  124.         Node<T>* p; // дополнительный указатель
  125.         Node<T>* p2;
  126.  
  127.         p = pTop;
  128.  
  129.         while (p != nullptr)
  130.         {
  131.             p2 = p; // сделать копию из p
  132.             p = p->next; // перейти на следующий элемент стека
  133.             delete p2; // удалить память, выделенную для предыдущего элемента
  134.         }
  135.         pTop = nullptr; // поправить вершину стека
  136.     }
  137.  
  138.     Stack<T>& operator=(const Stack<T>& LS)
  139.     {
  140.         // есть ли элементы в стеке?
  141.         if (pTop != nullptr) Empty();
  142.  
  143.         Node<T>* p; // дополнительный указатель
  144.         Node<T>* p2;
  145.         Node<T>* p3;
  146.  
  147.         // Инициализировать pTop
  148.         pTop = nullptr;
  149.         p3 = nullptr;
  150.  
  151.         p = LS.pTop; // указатель p двигается по списку SL.pTop->...
  152.         while (p != nullptr)
  153.         {
  154.             // 1. Сформировать узел p2
  155.             try {
  156.                 // попытка выделить память
  157.                 p2 = new Node<T>;
  158.             }
  159.             catch (bad_alloc e)
  160.             {
  161.                 // если память не выделена, то выход
  162.                 cout << e.what() << endl;
  163.                 return *this;
  164.             }
  165.             p2->data = p->data;
  166.             p2->next = nullptr;
  167.  
  168.             //  pTop = pTop + p2
  169.             if (pTop == nullptr) // создать стек
  170.             {
  171.                 pTop = p2;
  172.                 p3 = p2;
  173.             }
  174.             else
  175.             {
  176.                 p3->next = p2;
  177.                 p3 = p3->next;
  178.             }
  179.  
  180.             //  Перейти на следующий элемент
  181.             p = p->next;
  182.         }
  183.         return *this;
  184.     }
  185.  
  186.  
  187.     void Print(const char* objName)
  188.     {
  189.         cout << "Object: " << objName << endl;
  190.         if (pTop == nullptr)
  191.             cout << "stack is empty." << endl;
  192.         else
  193.         {
  194.             Node<T>* p; // дополнительный указатель
  195.             p = pTop;
  196.             while (p != nullptr)
  197.             {
  198.                 cout << p->data << "\t";
  199.                 p = p->next;
  200.             }
  201.             cout << endl;
  202.         }
  203.     }
  204.  
  205.    
  206.     ~Stack()
  207.     {
  208.         Empty();
  209.     }
  210.  
  211.    
  212.     T Pop()
  213.     {
  214.         if (pTop == nullptr)
  215.             return 0;
  216.  
  217.         Node<T>* p2;
  218.         T data;
  219.         data = pTop->data;
  220.  
  221.         p2 = pTop;
  222.         pTop = pTop->next;
  223.  
  224.         // Освободить память, выделенную под 1-й элемент
  225.         delete p2;
  226.         return data;
  227.     }
  228.  
  229.  
  230.     void operator!()
  231.     {
  232.         if (pTop == nullptr) {
  233.             return;
  234.         }
  235.         T max=pTop->data;
  236.         while (pTop != nullptr)
  237.         {  
  238.             pTop = pTop->next;
  239.             if ((pTop!=nullptr)&&(pTop->data>max))
  240.             {
  241.                 max = pTop->data;
  242.             }
  243.         }
  244.         cout << "Max element is: " << max << endl;
  245.     }
  246. };
  247.  
  248.  
  249.  
  250.  
  251.  
  252. #include <iostream>
  253. #include "Stack.h"
  254.  
  255. using namespace std;
  256.  
  257. int main()
  258. {
  259.     Stack <int> ST;
  260.     ST.Print("ST");
  261.  
  262.     ST.Push(8);
  263.     ST.Push(5);
  264.     ST.Push(10);
  265.     ST.Push(7);
  266.     ST.Print("ST");
  267.  
  268.     Stack <int> ST2 = ST;
  269.     Stack <int> ST4 = ST;
  270.     ST2.Print("ST2");
  271.     ST4.Print("ST4");
  272.     ST.Empty();
  273.     ST.Print("ST");
  274.  
  275.     ST = ST2;
  276.     ST.Print("ST = ST2");
  277.  
  278.     Stack <int> ST3;
  279.     ST3.Push(1);
  280.     ST3.Push(2);
  281.     ST3.Push(3);
  282.     ST3.Print("SL3");
  283.  
  284.     ST = ST2 = ST3;
  285.     ST.Print("ST");
  286.     ST2.Print("ST2");
  287.  
  288.     !ST4;
  289.  
  290.     int d = ST2.Pop();
  291.  
  292.     cout << "POP = " << d << endl;
  293.     ST2.Print("ST2-1");
  294.  
  295.     d = ST2.Pop();
  296.     ST2.Print("ST2-2");
  297.  
  298.     d = ST2.Pop();
  299.     ST2.Print("ST2-3");
  300.  
  301.     d = ST2.Pop();
  302.     cout << "POP = " << d << endl;
  303.     ST2.Print("ST2----");
  304.     return 0;
  305. }
  306.  
  307.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement