Список, що приймає різні типи даних

#include <iostream>

#include <string>

template <class K>

class Node

{

     K _data;

     Node* next;

public:

     Node() { }

     Node(K d) {

          _data = d;

          next = nullptr;

     }

     void setNext(Node* n) {

          next = n;

     }

     void setData(K val) {

          _data = val;

     }

     K getData() {

          return _data;

     }

     Node* getNext()

     {

          return next;

     }

     ~Node() { }

};

template <class T>

class List

{

     Node<T>* head;

     Node<T>* tail;

     int size;

public:

     List()

     {

          head = tail = nullptr;

          size = 0;

     }

     void PushBack(T val) {

          Node<T>* tmp = new Node<T>(val);

          if (size == 0)

          {

               head = tail = tmp;

               size = 1;

          }

          else {

               tail->setNext(tmp);

               tail = tmp;

               size++;

          }

     }

     T PopStart() {

          T d;

          if (size>0)

          {

               if (size == 1) {

                    d = head->getData();

                    delete head;

                    head = nullptr;

                    tail = nullptr;

                    size = 0;

               }

               else

               {

                    d = head->getData();

                    Node<T>* tmp = head;

                    head = head->getNext();

                    delete tmp;

                    size--;

               }

          }

          return d;

     }

     T PopBack() {

          T d;

          if (size>0)

          {

               if (size == 1) {

                    d = head->getData();

                    delete head;

                    head = nullptr;

                    tail = nullptr;

                    size = 0;

               }

               else

               {

                    d = tail->getData();

                    Node<T>* prev = head;

                    Node<T>* tmp = head;

                    Node<T>* next = head;

                    while (next != nullptr) {

                         prev = tmp;

                         tmp = next;

                         next = next->getNext();

                    }

                    delete tmp;

                    tail = prev;

                    tail->setNext(nullptr);

                    size--;

               }

          }

          return d;

     }

     void Show() {

Node<T>* cur = head;

while (cur) {

cout << cur->getData() << " ";

cur = cur->getNext();

}

     }

     ~List() { }

};

int main() {

     List<int> A;

     A.PushBack(3);

     A.PushBack(4);

     A.PushBack(5);

     cout << "Queque:" << endl;

     cout << A.PopStart() << endl;

     cout << A.PopStart() << endl;

     cout << A.PopStart() << endl;

     A.PushBack(3);

     A.PushBack(4);

     A.PushBack(5);

     cout << endl << "Stack:" << endl;

     cout << A.PopBack() << endl;

     cout << A.PopBack() << endl;

     cout << A.PopBack() << endl;

     cout << endl;

     List<string> B;

     B.PushBack("AA");

     B.PushBack("BB");

     B.PushBack("CC");

     cout << "Queque:" << endl;

     cout << B.PopStart()<<endl;

     cout << B.PopStart() << endl;

     cout << B.PopStart() << endl;

     B.PushBack("AA");

     B.PushBack("BB");

     B.PushBack("CC");

     cout << endl << "Stack:" << endl;

     cout << B.PopBack() << endl;

     cout << B.PopBack() << endl;

     cout << B.PopBack() << endl;

     system("pause");

     return 0;

}

Queque:

3

4

5

Stack:

5

4

3

Queque:

AA

BB

CC

Stack:

CC

BB

AA