Advertisement
VictoriaLodochkina

sacod lab 3_2

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