Advertisement
PavloSerg

Untitled

Feb 15th, 2023
1,476
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.59 KB | None | 0 0
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7.  
  8. namespace MyCollections
  9. {
  10.     public class MyQueue<T> : IEnumerable<T>
  11.     {
  12.         private const int _startCapacity = 8;
  13.         private T[] _items;
  14.         private int _capacity;
  15.         private int _head;
  16.         private int _tail;
  17.         public int Count { get; private set; }
  18.  
  19.         public MyQueue()
  20.         {
  21.             _items = new T[_startCapacity];
  22.             _capacity = _startCapacity;
  23.         }
  24.  
  25.         public void Enqueue(T item)
  26.         {
  27.             if (Count == _capacity)
  28.                 ExtendInnerArray();
  29.             _items[_head] = item;
  30.             _head++;
  31.             Count++;
  32.             if (_head == _capacity)
  33.                 _head = 0;
  34.         }
  35.         private void ExtendInnerArray()
  36.         {
  37.             if (_capacity == Array.MaxLength)
  38.                 throw new OutOfMemoryException();
  39.             int newCapacity = 2 * _capacity;
  40.             if ((uint)newCapacity > Array.MaxLength)
  41.                 newCapacity = Array.MaxLength;
  42.             T[] newItems = new T[newCapacity];
  43.             if (_tail < _head)
  44.             {
  45.                 Array.Copy(_items, _head, newItems, 0, Count);
  46.             }
  47.             else
  48.             {
  49.                 Array.Copy(_items, _tail, newItems, 0, _capacity - _tail);
  50.                 Array.Copy(_items, 0, newItems, _capacity - _tail, _head);
  51.             }
  52.             _items = newItems;
  53.             _tail = 0;
  54.             _head = _capacity;
  55.             _capacity = newCapacity;
  56.         }
  57.         public T Dequeue()
  58.         {
  59.             if (Count == 0)
  60.                 throw new InvalidOperationException("Queue is empty");
  61.             T returnValue = _items[_tail];
  62.             Count--;
  63.             _tail++;
  64.             if (_tail == _capacity)
  65.                 _tail = 0;
  66.             return returnValue;
  67.         }
  68.         public T Peek()
  69.         {
  70.             if (Count == 0)
  71.                 throw new InvalidOperationException("Queue is empty");
  72.             return _items[_tail];
  73.         }
  74.  
  75.         public IEnumerator<T> GetEnumerator()
  76.         {
  77.             int index = _tail;
  78.             for (int i = 0; i < Count; i++)
  79.             {
  80.                 yield return _items[index];
  81.                 index++;
  82.                 if (index == _capacity)
  83.                     index = 0;
  84.             }
  85.             yield break;
  86.         }
  87.         IEnumerator IEnumerable.GetEnumerator()
  88.         {
  89.             return GetEnumerator();
  90.         }
  91.     }
  92. }
  93.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement