namespace StackImplementation { internal class Stack { private int _top; private const int Capacity = 4; private readonly T[] _stack = new T[Capacity]; public Stack() { _top = -1; } private bool IsEmpty() { return _top < 0; } private bool IsFull() { return _top == Capacity - 1; } public void Peek() { System.Console.WriteLine(!IsEmpty() ? $"The topmost element is: {_stack[_top]}" : "The stack is empty."); } public T Pop() { return !IsEmpty() ? _stack[_top--] : default; } public void Push(T element) { if (!IsFull()) { _stack[++_top] = element; } else { System.Console.WriteLine("Cannot push - the stack is full."); } } public override string ToString() { if (IsEmpty()) { return "The stack is empty."; } var depiction = ""; for (var index = 0; index < _top; index++) { depiction += _stack[index].ToString() + ' '; } depiction += _stack[_top].ToString(); return $"Stack: [{depiction}]"; } } }