Реализовать дек и очередь через массив - C#
Формулировка задачи:
Всем доброго времени суток, делаю лабораторную работу.
Задача такая:Реализовать dequeue с помощью массива.
Или создать очередь при помощи массива.
У меня всё работает всё хорошо.
Мне не совсем ясна логика работы программы и синтаксис в некоторых местах, прошу объяснить мне что там и как происходит и что оно вообще такое, те места где мне не ясно я прокомментировал(ОБЪЯСНИТЕ).
Вот код:
Вот сам мейн
Код закинул полностью, вдруг кому-то надо будет))
namespace Lab_1
{
class Queue<T>
{
private T[] _array;//массив, где хранятся наши элементы очереди.
private int size;//количество елементов в очереди
private const int defaultCapacity = 10;// количество элементов под которые выделено памяти в момент создания объекта Очередь.
private int capacity;//количество элементов под которые выделено памяти, запомните, что не всегда size==capacity
private int head;//переменная которая указывает на передний элемент.
private int tail;//переменная которая указывает на задний элемент.
public Queue()
{
capacity = defaultCapacity;
_array = new T[defaultCapacity];
size = 0;
head = -1;
tail = 0;
}
public bool isEmpty() //проверка на пустоту
{
return size == 0;
}
//ОБЪЯСНИТЕ данный метод
public void Enqueue(T newElement)//добавляет елемент в конец списка
{
if (size == capacity)
{
T[] newQueue = new T[2 * capacity];//ОБЪЯСНИТЕ
Array.Copy(_array, 0, newQueue, 0, _array.Length);//ОБЪЯСНИТЕ
_array = newQueue;
capacity *= 2;
}
size++;
_array[tail++ % capacity] = newElement;
}
public T Dequeue()//удаляет и возвращает объект из начала Очереди
{
if (size == 0)
{
throw new InvalidOperationException();
}
size--;
return _array[++head % capacity];
}
public int Count//свойство для вывода size.
{
get
{
return size;
}
}
}
}namespace Lab_1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Очередь");
Queue<string> q = new Queue<string>();
Console.WriteLine("Очередь состоит из 10 елементов заплните их:");
string NewElement;
for (int i = 0; i < 10; i++)
{
NewElement = Console.ReadLine();
q.Enqueue(NewElement);
}
Console.WriteLine("Елементов в очереди {0}",q.Count);
//
string ConclusionElement;
for (int i = 0; i < 10; i++)
{
ConclusionElement = q.Dequeue();
Console.WriteLine("Елемен {0}, номерв очереди {1}",ConclusionElement,i+1);
}
Console.ReadLine();
}
}
}Решение задачи: «Реализовать дек и очередь через массив»
textual
Листинг программы
if (size == capacity) // старый массив стал тесноват.
{
T[] newQueue = new T[2 * capacity]; // создается новый массив, в два раза больше.
Array.Copy(_array, 0, newQueue, 0, _array.Length);// старый массив целиком копируется в новый
_array = newQueue;
capacity *= 2; // запоминаем, что емкость стала вдвое больше
}