kema

ArrayStack

Jan 22nd, 2018
262
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.20 KB | None | 0 0
  1. using System;
  2.  
  3. public class ArrayStack<T>
  4. {
  5.     private T[] elements;
  6.  
  7.     public int Count { get; private set; }
  8.  
  9.     private const int InitialCapacity = 2;
  10.  
  11.     public ArrayStack(int capacity = InitialCapacity)
  12.     {
  13.         this.elements = new T[capacity];
  14.     }
  15.     public void Push(T element)
  16.     {
  17.         if (this.Count == 0)
  18.         {
  19.             this.elements[this.Count] = element;
  20.             this.Count++;
  21.             return;
  22.         }
  23.  
  24.         if (this.Count >= this.elements.Length)
  25.         {
  26.             this.Grow();
  27.         }
  28.  
  29.         var newElements = new T[this.elements.Length];
  30.         this.CopyAllElementsTo(newElements, element);
  31.         this.elements = newElements;
  32.     }
  33.  
  34.     public T Pop()
  35.     {
  36.         int index = this.Count - 1;
  37.         CheckArrLenght(index);
  38.  
  39.         T deletedElement = this.elements[index];
  40.         this.elements[index] = default(T);
  41.         this.Count--;
  42.  
  43.         if (this.Count <= this.elements.Length / 4)
  44.         {
  45.             this.Shrink();
  46.         }
  47.         return deletedElement;
  48.     }
  49.  
  50.     public T[] ToArray()
  51.     {
  52.         var resultArr = new T[this.Count];
  53.         CopyAllElementsTo(resultArr);
  54.         return resultArr;
  55.     }
  56.  
  57.     private void Grow()
  58.     {
  59.         var newElements = new T[2 * this.elements.Length];
  60.         Array.Copy(this.elements, newElements, this.Count);
  61.         this.elements = newElements;
  62.     }
  63.  
  64.     private void CopyAllElementsTo(T[] resultArr)
  65.     {
  66.         for (int i = 0; i < this.Count; i++)
  67.         {
  68.             resultArr[i] = this.elements[i];
  69.         }
  70.     }
  71.  
  72.     private void CopyAllElementsTo(T[] newElements, T element)
  73.     {
  74.         newElements[0] = element;
  75.         Count++;
  76.  
  77.         for (int i = 1; i < this.Count; i++)
  78.         {
  79.             newElements[i] = this.elements[i - 1];
  80.         }
  81.     }
  82.  
  83.     private void CheckArrLenght(int index)
  84.     {
  85.         if (index < 0 || index >= this.Count)
  86.         {
  87.             throw new ArgumentOutOfRangeException();
  88.         }
  89.     }
  90.  
  91.     private void Shrink()
  92.     {
  93.         T[] newArr = new T[this.elements.Length / 2];
  94.         Array.Copy(this.elements, newArr, this.Count);
  95.         this.elements = newArr;
  96.     }
  97. }
Advertisement
Add Comment
Please, Sign In to add comment