Очередь: классы Queue и Queue
Очередь (queue) — это коллекция, в которой элементы обрабатываются по схеме "первый вошел, первый вышел" (first in, first out — FIFO). Элемент, вставленный в очередь первым, первым же и читается. Примерами очередей могут служить очередь в аэропорту, очередь претендентов на трудоустройство, очередь печати принтера либо циклическая очередь потоков на выделение ресурсов процессора.
Часто встречаются очереди, в которых элементы обрабатываются по-разному, в соответствии с приоритетом. Например, в очереди в аэропорту пассажиры бизнес-класса обслуживаются перед пассажирами экономкласса. Здесь может использоваться несколько очередей — по одной для каждого приоритета. В аэропорту это можно видеть наглядно, поскольку там предусмотрены две стойки регистрации для пассажиров бизнес-класса и эконом-класса. То же справедливо и для очередей печати и диспетчера потоков. У вас может быть массив списка очередей, где элемент массива означает приоритет. Внутри каждого элемента массива будет очередь, и обработка будет выполняться по принципу FIFO.
Очередь реализуется с помощью классов Queue из пространства имен System.Collections и Queue<T> из пространства имен System.Collections.Generic.
В классе Queue определяются приведенные ниже конструкторы:
public Queue()
public Queue (int capacity)
public Queue (int capacity, float growFactor)
public Queue (ICollection col)
В первой форме конструктора создается пустая очередь с выбираемыми по умолчанию емкостью и коэффициентом роста 2.0. Во второй форме создается пустая очередь, первоначальный размер которой определяет емкость, задаваемая параметром capacity, а коэффициент роста по умолчанию выбирается для нее равным 2.0. В третьей форме допускается указывать не только емкость (в качестве параметра capacity), но и коэффициент роста создаваемой очереди (в качестве параметра growFactor в пределах от 1.0 до 10.0). И в четвертой форме создается очередь, состоящая из элементов указываемой коллекции col. Ее первоначальная емкость равна количеству указанных элементов, а коэффициент роста по умолчанию выбирается для нее равным 2.0.
В классе Queue<T> определяются следующие конструкторы:
public Queue() public Queue(int capacity) public Queue(IEnumerable<T> collection)
В первой форме конструктора создается пустая очередь с выбираемой по умолчанию первоначальной емкостью, а во второй форме — пустая очередь, первоначальный размер которой определяет параметр capacity. И в третьей форме создается очередь, содержащая элементы коллекции, определяемой параметром collection. Ее первоначальная емкость равна количеству указанных элементов.
Члены класса Queue<T> представлены ниже:
- Count - Свойство Count возвращает количество элементов в очереди.
- Enqueue() - Метод Enqueue() добавляет элемент в конец очереди.
- Dequeue() - Метод Dequeue() читает и удаляет элемент из головы очереди. Если на момент вызова метода Dequeue() элементов в очереди больше нет, генерируется исключение InvalidOperationException.
- Peek() - Метод Peek() читает элемент из головы очереди, но не удаляет его.
- TrimExcess() - Метод TrimExcess() изменяет емкость очереди. Метод Dequeue() удаляет элемент из очереди, но не изменяет ее емкости. TrimExcess() позволяет избавиться от пустых элементов в начале очереди.
Давайте рассмотрим пример очереди:
using System; using System.Collections.Generic; namespace ConsoleApplication1 { class Program { static void Main() { Queue<int> qe = new Queue<int>(); Random ran = new Random(); for (int i = 0; i < 10; i++) qe.Enqueue(ran.Next(1, 10)); Console.WriteLine("Очередь: \n"); foreach (int i in qe) Console.Write(i); Console.ReadLine(); } } }
Комментарии