Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma once
- #include <iostream>
- #include <conio.h>
- #include <vector>
- #include <fstream>
- using namespace std;
- template <class T>
- class Node
- {
- Node* next;
- T data;
- template <typename U>
- friend class Stack;
- };
- template <class T>
- class Stack
- {
- private:
- Node<T>* pTop;
- Node<T>* pNEtop;
- public:
- Stack()
- {
- pTop = nullptr;
- pNEtop = nullptr;
- }
- Stack(Node<T>* SL)
- {
- if (SL == nullptr)
- {
- pTop = nullptr;
- pNEtop = nullptr;
- return;
- }
- this->pTop = SL;
- this->pNEtop = SL;
- this->next = nullptr;
- }
- void Push(T data)///////////////////////////////////////////////////////////////
- {
- Node<T>* p;
- p = new Node<T>;
- p->data = data;//****************
- p->next = pTop;
- pTop = p;
- }
- Stack(const Stack& SL)
- {
- Node<T>* pSL;
- Node<T>* temp;
- pTop = nullptr;
- pNEtop = nullptr;
- pSL = SL.pTop;
- if (pSL != nullptr)
- {
- Push(pSL->data);
- pNEtop = pTop;
- pSL = pSL->next;
- }
- while (pSL != nullptr)
- {
- temp = new Node<T>;
- temp->data = pSL->data;
- temp->next = nullptr;
- pNEtop->next = temp;
- pNEtop = pNEtop->next;
- pSL = pSL->next;
- }
- }
- void Empty()
- {
- Node<T>* p;
- Node<T>* p2;
- p = pTop;
- while (p != nullptr)
- {
- p2 = p;
- p = p->next;
- delete p2;
- }
- pTop = nullptr;
- }
- Stack<T>& operator=(const Stack<T>& SL)///////////////////////////////////////////
- {
- Node<T>* pSL;
- Node<T>* temp;
- pTop = nullptr;
- pNEtop = nullptr;
- pSL = SL.pTop;
- if (pSL != nullptr)
- {
- Push(pSL->data);
- pNEtop = pTop;
- pSL = pSL->next;
- }
- while (pSL != nullptr)
- {
- temp = new Node<T>;
- temp->data = pSL->data;
- temp->next = nullptr;
- pNEtop->next = temp;
- pNEtop = pNEtop->next;
- pSL = pSL->next;
- }
- return *this;
- }
- void Print(const char* objName)
- {
- cout << "Object: " << objName << endl;
- if (pTop == nullptr)
- cout << "stack is empty." << endl;
- else
- {
- Node<T>* p; // дополнительный указатель
- p = pTop;
- while (p != nullptr)
- {
- cout << p->data << "\t";
- p = p->next;
- }
- cout << endl;
- }
- }
- T end_elem() { //для модификации
- Node<T>* p; // дополнительный указатель
- p = pTop;
- while (p != nullptr)
- {
- p = p->next;
- if ((p->next) == nullptr)
- {
- break;
- }
- }
- return p->data;
- }
- bool prime(int n) {
- for (int i = 2; i <= sqrt(n); i++)
- if (n % i == 0)
- return false;
- return true;
- }
- int twins() {
- vector <int> v;
- int num;
- Node<T>* p; // дополнительный указатель
- p = pTop;
- while (p != nullptr)
- {
- num=p->data;
- if (prime(num)) {
- v.push_back(num);
- }
- p = p->next;
- }
- int twins = 0;
- for (int i = 0; i < v.size(); i++)
- {
- for (int j = i; j < v.size(); j++)
- {
- if (abs(v[i] - v[j]) == 2)
- {
- twins++;
- }
- }
- }
- return twins;
- }
- void writing() {
- //ofstream fof("input.txt");
- ofstream sss("text2.txt");
- int num;
- Node<T>* p; // дополнительный указатель
- p = pTop;
- while (p != nullptr)
- {
- num = p->data;
- p = p->next;
- sss << num;
- //fof << num;
- }
- }
- ~Stack()
- {
- Empty();
- }
- T Pop()
- {
- if (pTop == nullptr)
- return 0;
- Node<T>* p2;
- T data;
- data = pTop->data;
- p2 = pTop;
- pTop = pTop->next;
- // Освободить память, выделенную под 1-й элемент
- delete p2;
- return data;
- }
- };
- int main()
- {
- using namespace std;
- setlocale(LC_ALL, "Russian");
- long n;
- char ex = 'n';
- do {
- cout << "Введите номер задания: " << endl;
- char task;
- /*cin.ignore(100, '\n');*/
- cin >> task;
- switch (task)
- {
- case '1': {
- Stack <int> S;
- ifstream fin("input.txt");
- int num;
- while (fin >> num) ///
- {
- //fin >> num;
- S.Push(num);
- }
- S.Print("Stack");
- S.writing();
- cout << "Откройте файл input.txt для проверки результата." << endl;
- break;
- }
- case '2': {
- Stack <int> S;
- S.Push(8);
- S.Push(5);
- S.Push(10);
- S.Push(7);
- S.Push(S.end_elem());
- S.Print("Модификация, добавление в начало элемента с конца.");
- break;
- }
- case '3': {
- Stack <int> S;
- S.Push(8);
- S.Push(5);
- S.Push(10);
- S.Push(7);
- S.Push(1);
- S.Push(3);
- S.Push(11);
- S.Push(13);
- S.Print("Введенный стек");
- cout << "Количество близнецов: " << S.twins() << endl;
- break;
- }
- default: {cout << "Нет такой задачи.\n"; } break;
- }
- cout << "Если вы хотите выйти, нажмите \'y\', в противном случае-любую другую клавишу" << endl;
- cin.ignore(100, '\n');
- cin >> ex;
- } while (ex != 'y');
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement