Список 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