Очередь. Пример обобщенной коллекции

Во многих приложениях требуется создавать группы связанных объектов и управлять ими. Существует два способа группировки объектов: создать массив объектов и создать коллекцию.

Массивы удобнее всего использовать для создания и работы с фиксированным числом строго типизированных объектов.

Коллекции предоставляют более гибкий способ работы с группами объектов. В отличие от массивов, коллекция, с которой вы работаете, может расти или уменьшаться динамически при необходимости.

Коллекция является классом, поэтому необходимо объявить экземпляр класса перед добавлением в коллекцию элементов.

Если коллекция содержит элементы только одного типа данных, можно использовать один из классов в пространстве имен. Универсальная коллекция обеспечивает строгую типизацию, так что в нее нельзя добавить другие типы данных.

Примером такой коллекции является очередь (FIFO-список). Рассмотрим ее более подробно.

Определение очереди

Очередь (queue) — это коллекция, в которой элементы обрабатываются по схеме «первый вошел, первый вышел» (first in, first out — FIFO).
Элемент, вставленный в очередь первым, первым же и читается.

Примеры очередей

Очередь в аэропорту, очередь претендентов на трудоустройство, очередь печати принтера либо циклическая очередь потоков на выделение ресурсов процессора.

Часто встречаются очереди, в которых элементы обрабатываются по-разному, в соответствии с приоритетом. Например, в очереди в аэропорту пассажиры бизнес-класса обслуживаются перед пассажирами экономкласса.  Здесь может использоваться несколько очередей — по одной для каждого приоритета. В аэропорту это можно видеть наглядно, поскольку там предусмотрены две стойки регистрации для пассажиров бизнес-класса и эконом-класса. То же справедливо и для очередей печати и диспетчера потоков.

У вас может быть массив списка очередей, где элемент массива означает приоритет. Внутри каждого элемента массива будет очередь, и обработка будет выполняться по принципу FIFO.

Классы для работы с очередями

Очередь (queue) реализуется с помощью классов Queue из пространства имен System.Collections (набор необобщенных коллекций) и Queue<T> из пространства имен System.Collections.Generic — библиотека обобщенных «универсальных» коллекций — она используется в примере.
В классе Queue<T> определяются приведенные ниже конструкторы (в угловых скобках вместо Т указывается тип элемента очереди):
    public Queue<T>()
   public Queue<T> (int capacity)
   public Queue <T> (ICollection col)
В первой форме конструктора создается пустая очередь с выбираемыми по умолчанию емкостью.
Во второй форме создается пустая очередь, первоначальный размер которой определяет емкость, задаваемая параметром capacity.
В третьей форме создается очередь, состоящая из элементов указываемой уже ранее созданной коллекции col.

Члены класса Queue<T>:

Count. Свойство Count возвращает количество элементов в очереди.
Enqueue(). Метод Enqueue() добавляет элемент в конец очереди.
Dequeue(). Метод Dequeue() читает и удаляет элемент из головы очереди. Если на момент вызова метода Dequeue() элементов в очереди больше нет, генерируется исключение InvalidOperationException.
Peek(). Метод Peek() читает элемент из головы очереди, но не удаляет его.
TrimExcess(). Метод TrimExcess() изменяет емкость очереди.

Метод Dequeue() удаляет элемент из очереди, но не изменяет ее емкости. TrimExcess() позволяет избавиться от пустых элементов в начале очереди.

Пример очереди:

using System;
using System.Collections.Generic;
namespace ConsoleApplication1
{
   struct Client // структура Client - элемент очереди
   {
      public string Name;
      public Byte Age;

      public Client(string Name, Byte Age) // конструктор клиента
      {
         this.Name = Name;
         this.Age = Age;
      }
      public void WriteClient() // вывод данных о клиенте
      {
         Console.WriteLine("имя - {0} ; возраст - {1}", Name, Age);
      }
   }
   class Program
   {
      static void Main()
      {
         Client cl; // клиент (структура - запись)
         int n = 3; // задайте количество очередей целым числом
         Queue<Client> [] qe = new Queue<Client>[n]; // N очередей клиентов
         Random rn = new Random(); // генератор псевдослучайных чисел
         for (int j = 0; j < n; j++) // цикл по N очередям
         {
            qe[j] = new Queue<Client>(); // конструктор j-й очереди
            for (int i = 0; i < 3; i++) // добавление в очередь клиентов 
            {
               cl.Name = "Клиент "+(i+1).ToString(); // имя клиента
               cl.Age=(byte)rn.Next(20, 60); // возраст клиента 
               qe[j].Enqueue(cl); // добавление в j-ю очередь
            }
            // количество элементов в очереди
            Console.WriteLine("длина очереди = {0}", qe[j].Count); 
            Console.Write("Исходная очередь: \n");
            foreach (Client kl in qe[j]) // всю j-ю очередь - на печать
               kl.WriteClient();
            Client kg = qe[j].Peek(); // чтение элемента из головы очереди 
            Console.WriteLine("длина очереди = {0}", qe[j].Count);
            Console.Write("Головной элемент: \n");
            kg.WriteClient(); // первый клиент в очереди

            qe[j].Dequeue(); // удаление первого элемента из очереди
            Console.WriteLine("длина очереди = {0}", qe[j].Count); 
            Console.Write("Очередь: \n");
            foreach (Client kl in qe[j]) // всю очередь - на печать
            kl.WriteClient();
            Console.WriteLine("-----------------------------конец очереди {0} ",j); // разделитель очередей
         }  
         Console.ReadLine(); 
      }
   }
}

Результат:

Элементом очереди является структура Client (имя, возраст — добавляйте сюда все необходимое).

Обратите внимание, что сначала вызывается конструктор массива очередей, а затем в цикле уже вызывается конструктор каждой очереди.

После удаления первого элемента длина очереди уменьшается на 1.

Поэкспериментируйте с методами класса Queue<T>.


NEW: Наш Чат, в котором вы можете обсудить любые вопросы, идеи, поделиться опытом или связаться с администраторами.


Помощь проекту:

Понравилась статья? Поделиться с друзьями:
5 1 голос
Рейтинг статьи
Подписаться
Уведомить о
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
()
x