Реализация очереди в массиве. - C#
Формулировка задачи:
Приветствую форумчан. Помогите с задачкой
"Реализовать операции с очередью в массиве. Пусть очередь прирастает справа, убывает слева. Длина массива должна соответствовать длине очереди."
Заранее благодарен.
Решение задачи: «Реализация очереди в массиве.»
textual
Листинг программы
#region using
using System;
#endregion
namespace ConsoleApplicationTest
{
public static class Program
{
private static void Main()
{
// Применение
var myQueue = new MyQueue();
// Добавляем элементы
myQueue.Enqueue(1);
myQueue.Enqueue(2);
myQueue.Enqueue(3);
myQueue.Enqueue(4);
myQueue.Enqueue(5);
myQueue.Enqueue(6);
// Извлекаем элементы
while (myQueue.Count > 0)
Console.WriteLine(myQueue.Dequeue());
Console.ReadKey();
}
}
public class MyQueue
{
// Массив с элементами
private int[] _array;
// Индекс начального элемента.
private int _head;
// Индекс конечного элемента.
private int _tail;
/// <summary>
/// Создаём очередь. Начальная ёмкость - 4;
/// </summary>
public MyQueue()
{
_array = new int[4];
}
/// <summary>
/// Количество элементов в очереди.
/// </summary>
public int Count { get; private set; }
/// <summary>
/// Очистка очереди.
/// </summary>
public void Clear()
{
// Очищаем все поля.
_array = new int[4];
_head = 0;
_tail = 0;
Count = 0;
}
/// <summary>
/// Извлечение элемента из очереди.
/// </summary>
/// <returns>Извлечённый элемент.</returns>
public int Dequeue()
{
// Проверяем, можно ли что-либо достать из очереди.
if (Count == 0)
throw new InvalidOperationException();
// Достаём первый элемент.
int local = _array[_head];
// Обнуляем первый элемент.
_array[_head] = 0;
// Изменяем индекс начала элементов в массиве.
_head = (_head + 1)%_array.Length;
// Убавляем количество элементов.
Count--;
return local;
}
/// <summary>
/// Добавление элемента в очередь.
/// </summary>
/// <param name="item">Добавляемый элемент.</param>
public void Enqueue(int item)
{
// Проверяем ёмкость массива, если недостаточна - удваиваем.
if (Count == _array.Length)
{
var capacity = _array.Length*2;
SetCapacity(capacity);
}
// Устанавливаем последний элемент.
_array[_tail] = item;
// Изменяем индекс конца массива.
_tail = (_tail + 1)%_array.Length;
// Прибавляем количество элементов.
Count++;
}
/// <summary>
/// Просмотр элемента на вершине очереди.
/// </summary>
/// <returns>Верхний элемент.</returns>
public int Peek()
{
if (Count == 0)
throw new InvalidOperationException();
// Возвращаем верхний элемент без его удаления.
return _array[_head];
}
// Изменение ёмкости очереди.
private void SetCapacity(int capacity)
{
// Новый массив заданного объёма.
int[] destinationArray = new int[capacity];
if (Count > 0)
{
// Копируем старый массив в новый.
if (_head < _tail)
Array.Copy(_array, _head, destinationArray, 0, Count);
else
{
Array.Copy(_array, _head, destinationArray, 0, _array.Length - _head);
Array.Copy(_array, 0, destinationArray, _array.Length - _head, _tail);
}
}
_array = destinationArray;
// Новые значения индексов начала и конца массива.
_head = 0;
if (Count == capacity)
_tail = 0;
else
_tail = Count;
}
}
}