elena1234

Create Custom Queue

Feb 15th, 2021 (edited)
375
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.91 KB | None | 0 0
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4.  
  5. namespace CreateCustomQueue
  6. {
  7.     public class CustomQueue<T> : IEnumerable<T>
  8.     {
  9.         private const int InitialCapacity = 4;
  10.         private int currentCapacity;
  11.         public T[] elementsInQueue;
  12.  
  13.         public CustomQueue()
  14.         {
  15.             currentCapacity = InitialCapacity;
  16.             this.elementsInQueue = new T[currentCapacity];
  17.         }
  18.  
  19.         public CustomQueue(int capacity)
  20.         {
  21.             currentCapacity = capacity;
  22.             this.elementsInQueue = new T[currentCapacity];
  23.         }
  24.  
  25.         private void Validate()
  26.         {
  27.             if (this.Count == 0)
  28.             {
  29.                 throw new Exception("The queue is empty!");
  30.             }
  31.         }
  32.  
  33.         public int Count { get; private set; }
  34.  
  35.         private T[] Resize()
  36.         {
  37.             T[] newArray = new T[2 * currentCapacity];
  38.             this.currentCapacity = newArray.Length;
  39.             this.elementsInQueue.CopyTo(newArray, 0);
  40.             return newArray;
  41.         }
  42.  
  43.         private T[] Shrink()
  44.         {
  45.             T[] newArray = new T[currentCapacity / 2];
  46.             this.currentCapacity = newArray.Length;
  47.             for (int i = 0; i < this.Count-1; i++)
  48.             {
  49.                 newArray[0] = this.elementsInQueue[i + 1];
  50.             }
  51.             this.elementsInQueue = newArray;
  52.             return newArray;
  53.         }
  54.  
  55.         public void Enqueue(T element)
  56.         {
  57.             if (this.Count == currentCapacity)
  58.             {
  59.                 T[] newArray = Resize();
  60.                 newArray[this.Count] = element;
  61.                 this.elementsInQueue = newArray;
  62.                 this.Count++;
  63.             }
  64.  
  65.             else
  66.             {
  67.                
  68.                 this.elementsInQueue[this.Count] = element;
  69.                 this.Count++;
  70.             }
  71.         }
  72.  
  73.         public T Dequeue()
  74.         {
  75.             Validate();
  76.             T firstElement = this.elementsInQueue[0];
  77.             if (this.Count - 1 <= currentCapacity / 4)
  78.             {
  79.                 Shrink();
  80.                 this.Count--;
  81.                 return firstElement;
  82.             }
  83.  
  84.             for (int i = 0; i < this.Count-1; i++)
  85.             {
  86.                 this.elementsInQueue[i] = this.elementsInQueue[i + 1];
  87.             }
  88.             this.Count--;
  89.             return firstElement;
  90.         }
  91.  
  92.         public T Peek()
  93.         {
  94.             Validate();
  95.             T firstElement = this.elementsInQueue[0];
  96.             return firstElement;
  97.         }
  98.  
  99.         public IEnumerator<T> GetEnumerator()
  100.         {
  101.             for (int i = 0; i < this.Count; i++)
  102.             {
  103.                 yield return this.elementsInQueue[i];
  104.             }
  105.         }
  106.  
  107.         IEnumerator IEnumerable.GetEnumerator()
  108.         {
  109.             return GetEnumerator();
  110.         }
  111.     }
  112. }
  113.  
Add Comment
Please, Sign In to add comment