Список head, tail, size

#include <iostream>

using namespace std;

class Node

{

     int _data;

     Node* next; 

 public:

     Node(){ }

     Node(int d) {

          _data = d;

          next = nullptr;

     }

    void setNext(Node* n) {

        next = n;

    }

    void setData(int val) {

        _data = val;

    }

    int getData() {

        return _data;

    }

    Node* getNext()

    {

        return next;

    }

    ~Node(){ }

};

class List

{

     Node* head;

     Node* tail;

     int size; 

 public:

    List()

    {

        head = tail = nullptr;

        size = 0;

     }

     void PushBack(int val) {

          Node* tmp = new Node(val); 

          if (size == 0)

          {

               head = tail = tmp; 

               size = 1; 

          }

          else {

               tail->setNext(tmp);

               tail = tmp;

               size++;

          }

     }

     int PopStart() {

          int d = 0;

          if (size>0)

          {

               if (size == 1) { 

                    d = head->getData();

                    delete head; 

                    head = nullptr;

                    tail = nullptr; 

                    size = 0;

               }

               else 

               {

                    d = head->getData(); 

                    Node* tmp = head; 

                    head = head->getNext(); 

                    delete tmp; 

                    size--; 

               }

          }

     return d;

     }

    int PopBack() {

        int d = 0;

        if (size>0)

        {

            if (size == 1) {

                d = head->getData();

                delete head;

                head = nullptr;

                tail = nullptr;

                size = 0;

            }

            else 

           {

               d = tail->getData();

               Node* prev = head; 

               Node* tmp = head;

               Node* 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*cur = head;

          while (cur) {

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

               cur = cur->getNext();

          }

     }

     ~List(){ }

};

int main() {

     List A;

     A.PushBack(3);

     A.PushBack(4);

     A.PushBack(5);

     cout << "Queque (real):" << 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  (simulation):" << endl;

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

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

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

     system("pause");

     return 0;

}

Queque (real):

3

4

5

Stack (simulation):

5

4

3