Реализовать с использованием шаблона класса стек

Помогите пожалуйста реализовать данную задачу с помощью шаблона стека.

Сама задача на скриневведите сюда описание изображения Программа без шаблона

main.cpp

#include <iostream>
#include <clocale>
#include <Stack.h>

using namespace std;

struct Node
{
    int number;
    int info;
    Node* p;
};
void add_car(Node** top, int number);
void delete_car(Node** top, int number);
int main()
{
    setlocale(LC_ALL, "Russian");
    int number;
    Node* top1 = 0;
    int menu = 0;
    do
    {
        cout << "1.Добавить машину" << endl;
        cout << "2.Удалить машину" << endl;
        //cout << "4.Показать гараж" << endl;
        cout << "3.Выход" << endl;
        cin >> menu;
        switch (menu)
        {
        case 1:
            cout << "Введите номер машины" << endl;
            cin >> number;
            add_car(&top1, number);
            system("pause");
            system("cls");
            break;
        case 2:
            cout << "Введите номер машины" << endl;
            cin >> number;
            delete_car(&top1, number);
            system("pause");
            system("cls");
            break;
        }
    } while (menu != 3);
    return 0;
}
void add_car(Node** top, int number)
{
    Node* pv = new Node;
    pv->p = 0;
    pv->number = number;
    cout << "Машина с номером " << ' ' << pv->number << ' ' << "въехала на стоянку" << endl;
    pv->info = 0;
    if (*top == 0)
    {
        *top = pv;
    }
    else
    {
        pv->p = *top;
        *top = pv;
    }
}
void delete_car(Node** top, int number)
{
    Node* tmp = *top;
    Node* tmp2 = *top;
    Node* pr = 0;
    while ((tmp != 0) && (tmp->number != number))
    {
        pr = tmp;
        tmp = tmp->p;
    }
    if (tmp == 0)
    {
        cout << "Машины с данным номером нет на стоянке" << endl;
    }
    else
    {
        cout << "Машина с номером" << ' ' << tmp->number << ' ' << "выезжала со стоянки для беспечения выезда других автомобилей" << ' ' << tmp->info++ << ' ' << "раз" << endl;
        while (tmp2 != tmp)
        {
            tmp2->info++;
            tmp2 = tmp2->p;
        }
        if (pr != 0)
            pr->p = tmp->p;
        if (tmp == *top)
            *top = (*top)->p;
        delete tmp;
    }
}

Сделать например с помощью такого шаблона

Stack.h

#ifndef STACK_H
#define STACK_H


#include <cassert> // для assert
#include <iostream>

#include <iomanip> // для setw

template <typename T>
class Stack
{
private:
    T* stackPtr;                      // указатель на стек
    const int size;                   // максимальное количество элементов в стеке
    int top;                          // номер текущего элемента стека
public:
    Stack(int = 10);                  // по умолчанию размер стека равен 10 элементам
    Stack(const Stack<T>&);          // конструктор копирования
    ~Stack();                         // деструктор

    inline void push(const T&);     // поместить элемент в вершину стека
    inline T pop();                   // удалить элемент из вершины стека и вернуть его
    inline void printStack();         // вывод стека на экран
    inline const T& Peek(int) const; // n-й элемент от вершины стека
    inline int getStackSize() const;  // получить размер стека
    inline T* getPtr() const;         // получить указатель на стек
    inline int getTop() const;        // получить номер текущего элемента в стеке
};

// реализация методов шаблона класса STack

// конструктор Стека
template <typename T>
Stack<T>::Stack(int maxSize) :
    size(maxSize) // инициализация константы
{
    stackPtr = new T[size]; // выделить память под стек
    top = 0; // инициализируем текущий элемент нулем;
}

// конструктор копирования
template <typename T>
Stack<T>::Stack(const Stack<T>& otherStack) :
    size(otherStack.getStackSize()) // инициализация константы
{
    stackPtr = new T[size]; // выделить память под новый стек
    top = otherStack.getTop();

    for (int ix = 0; ix < top; ix++)
        stackPtr[ix] = otherStack.getPtr()[ix];
}

// функция деструктора Стека
template <typename T>
Stack<T>::~Stack()
{
    delete[] stackPtr; // удаляем стек
}

// функция добавления элемента в стек
template <typename T>
inline void Stack<T>::push(const T& value)
{
    // проверяем размер стека
    assert(top < size); // номер текущего элемента должен быть меньше размера стека

    stackPtr[top++] = value; // помещаем элемент в стек
}

// функция удаления элемента из стека
template <typename T>
inline T Stack<T>::pop()
{
    // проверяем размер стека
    assert(top > 0); // номер текущего элемента должен быть больше 0

    stackPtr[--top]; // удаляем элемент из стека
}

// функция возвращает n-й элемент от вершины стека
template <class T>
inline const T& Stack<T>::Peek(int nom) const
{
    //
    assert(nom <= top);

    return stackPtr[top - nom]; // вернуть n-й элемент стека
}

// вывод стека на экран
template <typename T>
inline void Stack<T>::printStack()
{
    for (int ix = top - 1; ix >= 0; ix--)
        cout << "|" << setw(4) << stackPtr[ix] << endl;
}

// вернуть размер стека
template <typename T>
inline int Stack<T>::getStackSize() const
{
    return size;
}

// вернуть указатель на стек (для конструктора копирования)
template <typename T>
inline T* Stack<T>::getPtr() const
{
    return stackPtr;
}

// вернуть размер стека
template <typename T>
inline int Stack<T>::getTop() const
{
    return top;
}

#endif // STACK_H

Или любые другие,вот ещё пару вариантов шаблонов

Stack.h

#include <iostream>
#include <cstdlib>
using namespace std;

// define default capacity of stack
#define SIZE 10

// Class for stack
template <class X>
class stack
{
    X* arr;
    int top;
    int capacity;

public:
    stack(int size = SIZE); // constructor

    void push(X);
    X pop();
    X peek();

    int size();
    bool isEmpty();
    bool isFull();

    // destructor
    ~stack() {
        delete[] arr;
    }
};

// Constructor to initialize stack
template <class X>
stack<X>::stack(int size)
{
    arr = new X[size];
    capacity = size;
    top = -1;
}

// function to add an element x in the stack
template <class X>
void stack<X>::push(X x)
{
    if (isFull())
    {
        cout << "OverFlow\nProgram Terminated\n";
        exit(EXIT_FAILURE);
    }

    cout << "Inserting " << x << endl;
    arr[++top] = x;
}

// function to pop top element from the stack
template <class X>
X stack<X>::pop()
{
    // check for stack underflow
    if (isEmpty())
    {
        cout << "UnderFlow\nProgram Terminated\n";
        exit(EXIT_FAILURE);
    }

    cout << "Removing " << peek() << endl;

    // decrease stack size by 1 and (optionally) return the popped element
    return arr[top--];
}

// function to return top element in a stack
template <class X>
X stack<X>::peek()
{
    if (!isEmpty())
        return arr[top];
    else
        exit(EXIT_FAILURE);
}

// Utility function to return the size of the stack
template <class X>
int stack<X>::size()
{
    return top + 1;
}

// Utility function to check if the stack is empty or not
template <class X>
bool stack<X>::isEmpty()
{
    return top == -1;   // or return size() == 0;
}

// Utility function to check if the stack is full or not
template <class X>
bool stack<X>::isFull()
{
    return top == capacity - 1; // or return size() == capacity;
}

Stack.h

#pragma once

template <typename T>
class Stack {
private:
    T* start; //указатель на стек
    int t; //положение вершины стека
    int size; //размер стека

public:
    class StackERR
    {
        int code;
    public:
        StackERR(int n = 0) : code(n) {}
        int getCode()
        {
            return code;
        }
    };

        //конструктор с параметром– размер стека
        Stack(int n = 10);
    ~Stack() { delete[] start; } //деструктор
    // операции
    void push(const T&); //в стек
    T pop(); //из стека
    T top() const; //вершина стека

        // проверки
        bool isEmpty() const { return t == -1; }
    //true, если стек пустой
    bool isFull() const { return t == size - 1; }
    //true, если стек полон
};


//конструктор
template < typename T>
Stack<T> ::Stack(int n)
{
    //«разумный» размер стека
    size = n > 0 && n < 1000 ? n : 10;
    start = new T[size];
    t = -1;
}

//помещение объекта в стек
template < typename T>
void Stack<T>::push(const T & x) {
    if (!isFull()) {
        start[++t] = x; //сдвигаем вершину
        return;
    }
    throw StackERR(1); //стек полон
}

//выталкивание элемента из стека
template < typename T>
T Stack<T>::pop() {
    if (!isEmpty()) {
        return start[t--];
        //взяли элемент, опустили вершину
    }
    throw StackERR(2); //в стеке нет элементов
}

//просмотр элемента из вершины стека
template < typename T>
T Stack<T>::top()const {
    if (!isEmpty()) {
        return start[t];
    }
    throw StackERR(2);
}

Ответы (0 шт):