Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- public class ArrayStack<T>
- {
- private T[] elements;
- public int Count { get; private set; }
- private const int InitialCapacity = 2;
- public ArrayStack(int capacity = InitialCapacity)
- {
- this.elements = new T[capacity];
- }
- public void Push(T element)
- {
- if (this.Count == 0)
- {
- this.elements[this.Count] = element;
- this.Count++;
- return;
- }
- if (this.Count >= this.elements.Length)
- {
- this.Grow();
- }
- var newElements = new T[this.elements.Length];
- this.CopyAllElementsTo(newElements, element);
- this.elements = newElements;
- }
- public T Pop()
- {
- int index = this.Count - 1;
- CheckArrLenght(index);
- T deletedElement = this.elements[index];
- this.elements[index] = default(T);
- this.Count--;
- if (this.Count <= this.elements.Length / 4)
- {
- this.Shrink();
- }
- return deletedElement;
- }
- public T[] ToArray()
- {
- var resultArr = new T[this.Count];
- CopyAllElementsTo(resultArr);
- return resultArr;
- }
- private void Grow()
- {
- var newElements = new T[2 * this.elements.Length];
- Array.Copy(this.elements, newElements, this.Count);
- this.elements = newElements;
- }
- private void CopyAllElementsTo(T[] resultArr)
- {
- for (int i = 0; i < this.Count; i++)
- {
- resultArr[i] = this.elements[i];
- }
- }
- private void CopyAllElementsTo(T[] newElements, T element)
- {
- newElements[0] = element;
- Count++;
- for (int i = 1; i < this.Count; i++)
- {
- newElements[i] = this.elements[i - 1];
- }
- }
- private void CheckArrLenght(int index)
- {
- if (index < 0 || index >= this.Count)
- {
- throw new ArgumentOutOfRangeException();
- }
- }
- private void Shrink()
- {
- T[] newArr = new T[this.elements.Length / 2];
- Array.Copy(this.elements, newArr, this.Count);
- this.elements = newArr;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment