Реализация очереди в массиве. - 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;
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.8 из 5
Похожие ответы