Например, вот так:
public class SimpleSystemStack<T> where T : struct, IConvertible {
private readonly int _sizeOfOneElement;
private T[] _array;
public SimpleSystemStack( int sizeOfOneElement, T[] inputArray = null ) {
_sizeOfOneElement = sizeOfOneElement;
if ( inputArray?.Length > 0 ) {
Length = inputArray.Length;
_array = inputArray;
} else {
Length = 0;
_array = new T[sizeOfOneElement];
}
}
public int Length { get; private set; }
public T Pop() {
if ( Length > 0 ) {
Length--;
return _array[Length];
}
throw new IndexOutOfRangeException("Stack is Empty.");
}
public void Push( T element ) {
if ( Length >= int.MaxValue )
throw new IndexOutOfRangeException("Stack overflow.");
if ( Length >= _array.Length ) {
var temp = new T[_array.Length * 2];
Buffer.BlockCopy( _array, 0, temp, 0, Length * _sizeOfOneElement );
_array = temp;
}
_array[Length] = element;
Length++;
}
}
Использование:
var sss = new SimpleSystemStack<int>( sizeof( int ) );
sss.Push( 1 );
sss.Push( 2 );
sss.Push( 3 );
sss.Pop();
sss.Pop();
sss.Push( 4 );
Работает только для primitive types.