4.3

#ifndef STACK_H
#define STACK_H
// Created by MBBahodir 
#include <cassert>  
#include <iostream>

#include <iomanip>  

template <typename T>
class Stack {
private:
    T* stackPtr;                      // stackka koʻsatkich
    const int size;                   // stackdagi maksimal elementlar soni
    int top;                          // stackning joriy elementi
public:
    Stack(int = 10);                  // stackning joriy holatda elementlar soni 10 ta
    Stack(const Stack<T>&);          // nusxalsh konstruktori
    ~Stack();                         // destruktor

    inline void push(const T&);     // elementni stackning yuqori qismiga joylashtirish
    inline T pop();                   // stack ichidan eng yuqoridagi elementni oʻchirish
    inline void printStack();         // stackni ekranga chiqarish
    inline const T& Peek(int) const; // stackning yuqorisidagidam keyingi n-element
    inline int getStackSize() const;  // stack oʻlchamini olish
    inline T* getPtr() const;         // stackka koʻrsatkich olish
    inline int getTop() const;        // joriy elementni olish
};

// Stack sinfi shablon funksiyalarini realizatsiyz qilish

// konstruktor Steka
template <typename T>
Stack<T>::Stack(int maxSize) : size(maxSize) // oʻzgarmaslarni initsalizatsiyalash
{
    stackPtr = new T[size]; // xotira ajratish
    top = 0; // joriy elementno 0 bilan toldirish;
}

// nusxalsh konstruktori
template <typename T>
Stack<T>::Stack(const Stack<T>& otherStack) :
    size(otherStack.getStackSize()) // oʻzgarmaslarni initsalizatsiyalash
{
    stackPtr = new T[size]; // yangi xotira ajratish
    top = otherStack.getTop();

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

// destruktor 
template <typename T>
Stack<T>::~Stack()
{
    delete[] stackPtr; // ochirish
}

// element qoʻshish
template <typename T>
inline void Stack<T>::push(const T& value)
{
    // oʻlchamni oʻzgartirish
    assert(top < size); // joriy element soni oʻlchamdan kichik boʻlishi kerak

    stackPtr[top  ] = value; // elementni joylashtirish
}

// elementni oʻchirish
template <typename T>
inline T Stack<T>::pop()
{
    // oʻlchamni tekshirish
    assert(top > 0); // joriy element 0 katta boʻlishi kerak

    stackPtr[--top]; //  elementni oʻchirish
    return 0;
}

// yuqori elementdan n-elementni qaytaradi
template <class T>
inline const T& Stack<T>::Peek(int nom) const
{
    //
    assert(nom <= top);

    return stackPtr[top - nom]; // n-elementni qaytarish 
}

// ekranga chiqarish
template <typename T>
inline void Stack<T>::printStack()
{
    for (int ix = top - 1; ix >= 0; ix--)
        cout << "|" << setw(4) << stackPtr[ix] << endl;
}

// oʻlchamni qaytarish
template <typename T>
inline int Stack<T>::getStackSize() const
{
    return size;
}

// koʻrsatkich qaytarish (nusxalash konstruktori uchun)
template <typename T>
inline T* Stack<T>::getPtr() const
{
    return stackPtr;
}

// oʻlchamni qaytarish
template <typename T>
inline int Stack<T>::getTop() const
{
    return top;
}

#endif // STACK_H
Run on cpp.sh