Реализация очереди в массиве. - 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; } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д