1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | using System; public class ArrayStack<T> : IArrayStack<T> { private const int InitialCapacity = 16; private T[] internalStorage; private int capacity; public ArrayStack( int capacity = InitialCapacity) { this .Capacity = capacity; this .internalStorage = new T[ this .Capacity]; } public int Count { get ; private set ; } private int Capacity { get { return this .capacity; } set { if (value <= 0) { throw new ArgumentOutOfRangeException( nameof(value), "Capacity should be positive integer number." ); } this .capacity = value; } } public void Push(T element) { if ( this .GrowNeeded()) { this .Grow(); } this .internalStorage[ this .Count] = element; this .Count++; } public T Pop() { if ( this .Count <= 0) { throw new InvalidOperationException( "Stack is empty." ); } this .Count--; var element = this .internalStorage[ this .Count]; this .internalStorage[ this .Count] = default (T); return element; } public T Peek() { var element = this .internalStorage[ this .Count - 1]; return element; } public T[] ToArray() { var arr = new T[ this .Count]; this .FillStorage(arr); Array.Reverse(arr); return arr; } private bool GrowNeeded() { var result = this .Count >= this .Capacity; return result; } private void Grow() { this .Capacity *= 2; var newStorage = new T[ this .Capacity]; this .FillStorage(newStorage); this .internalStorage = newStorage; } private void FillStorage(T[] array) { Array.Copy( this .internalStorage, array, this .Count); } } |