Очередь в си шарп
Очередь в си шарп
На тридцать восьмом уроке учебника по основам C# мы поговорим об использовании класса Queue. Эта коллекция включает функциональные возможности, необходимые в структуре очередей «первым пришёл — первым ушёл» (FIFO). Очереди позволяют хранить элементы для последующей обработки.
Что такое очередь?
В информатике очередь — это структура данных, которая позволяет хранить элементы для последующего извлечения. Когда элементы извлекаются из очереди, они доступны в том порядке, в котором они были добавлены первоначально.
Очереди имеют много применений в разработке программного обеспечения. Характер очереди позволяет использовать ее в ситуациях, когда сообщения или информация должны обрабатываться в том порядке, в котором они были получены, в то же время позволяя задерживать обработку, когда спрос высок. При интеграции разрозненных систем может быть важно, чтобы обновления обрабатывались во избежание проблем целостности данных. Например, может быть недопустимо пытаться обработать строки заказа на продажу до того, как будет создан заголовок заказа на продажу.
Платформа .NET framework включает тип коллекции Queue. Этот класс предоставляет функциональные возможности, необходимые для работы с очередями FIFO без дополнительного программирования. Класс Queue предоставляет очень простой тип коллекции, который может содержать любой объект, включая повторяющиеся элементы и значения null.
Коллекция Queue реализует интерфейс ICollection. Это поведение описано в предыдущей статье интерфейсы коллекции. В остальной части этой статьи описываются дополнительные функциональные возможности Queue.
Класс Queue имеет четыре конструктора для создания экземпляров новых коллекций. Первый является самым базовым, без параметров. Новая, пустая очередь генерируется с емкостью для хранения до тридцати двух элементов. Если добавляется тридцать третий элемент, емкость очереди автоматически удваивается. Она удваивается снова каждый раз при превышении размера.
Если максимальное число элементов, которые будут храниться в очереди, известно до создания коллекции, более эффективно объявить требуемую емкость во время создания экземпляра. Если размер занижен и заявленная вместимость превышена, то вместимость все равно будет удвоена для размещения дополнительных предметов. Чтобы объявить начальную емкость очереди, передайте ее конструктору в виде целочисленного параметра.
По умолчанию каждый раз, когда емкость очереди превышена, то она удваивается. Это удвоение происходит потому, что стандартный коэффициент роста очереди равен 2. Этот множитель можно настроить при создании экземпляра очереди, передав второй параметр float, содержащий коэффициент роста между единицей и десятью. При превышении емкости текущий размер умножается на это значение.
В следующем примере создается очередь с начальной емкостью десять элементов и коэффициентом роста 1,5.
Конечный конструктор разрешает создание предварительно заполненной очереди. Если у вас есть коллекция элементов в классе, который реализует интерфейс ICollection, это может использоваться в качестве исходных данных для новой очереди. Каждый элемент коллекции добавляется в очередь в том порядке, в котором обычно перечисляется исходная коллекция.
Структуры очередей позволяют добавлять новые элементы в конец очереди и извлекать существующие элементы из передней части. Чтобы добавить новый элемент в конец очереди, вызывается метод Enqueue. Метод имеет один параметр, содержащий объект для добавления в очередь.
Вы можете извлечь элементы из очереди с помощью метода Dequeue. Он возвращает элемент, отображающийся в передней части очереди в качестве объекта, который можно привести к правильному типу. В следующем примере метод ToString используется для выполнения преобразования, когда три элемента добавляются и затем извлекаются из очереди. Обратите внимание, что порядок извлечения совпадает с порядком, в котором были добавлены элементы.
Вы можете получить элемент в начале очереди, не изменяя содержимое коллекции. Метод Peek аналогичен методу Dequeue, но при получении следующего элемента он также остается в начале очереди.
Другие методы Queue
В дополнение к методам обработки очереди FIFO, класс Queue предоставляет другие функциональные возможности для доступа к коллекции. Они улучшают структуру данных с поведением, аналогичным поведению некоторых других типов коллекций и списков.
Метод Clear используется для очистки содержимого очереди. Метод не требует никаких параметров.
По мере увеличения количества элементов в коллекции очередей размер очереди также может увеличиваться. Используя стандартные настройки, каждый раз, когда емкость коллекции превышена, она удваивается. По мере опорожнения очереди ее емкость не уменьшается. Это может привести к большому объему потерянной памяти для больших очередей. Чтобы уменьшить это, очередь можно обрезать, чтобы освободить память, выделенную для пустого пространства, используя метод TrimToSize.
Поскольку класс Queue не включает свойство, возвращающее текущую емкость,трудно показать эффект выполнения метода TrimToSize. Однако этот метод можно использовать, как показано в следующем примере:
Иногда вам нужно будет определить, существует ли указанный элемент в очереди без снятия очереди с каждого элемента, чтобы найти его. Метод Contains решает эту проблему, возвращая логическое значение, указывающее, находится ли предоставленный объект в очереди.
Существует еще один метод, который позволяет считывать содержимое очереди, не нарушая порядок элементов. Аналогичным образом, как и в случае с ArrayList, содержимое очереди может быть извлечено в массив объектов.
Создание потокобезопасной оболочки очереди
В предыдущей статье, посвященной интерфейсам коллекций, была описана концепция потокобезопасной синхронизированной коллекции. Для создания потокобезопасной очереди с помощью статического метода Synchronized создается синхронизированная коллекция обертки.
Автор этого материала — я — Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML — то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
статьи IT, уроки по си шарп, си шарп, коллекции, Queue
Очередь: классы Queue и Queue
C# — Руководство по C# — Очередь: классы Queue и Queue
Очередь (queue) — это коллекция, в которой элементы обрабатываются по схеме «первый вошел, первый вышел» (first in, first out — FIFO). Элемент, вставленный в очередь первым, первым же и читается. Примерами очередей могут служить очередь в аэропорту, очередь претендентов на трудоустройство, очередь печати принтера либо циклическая очередь потоков на выделение ресурсов процессора. Часто встречаются очереди, в которых элементы обрабатываются по-разному, в соответствии с приоритетом. Например, в очереди в аэропорту пассажиры бизнес-класса обслуживаются перед пассажирами экономкласса. Здесь может использоваться несколько очередей — по одной для каждого приоритета. В аэропорту это можно видеть наглядно, поскольку там предусмотрены две стойки регистрации для пассажиров бизнес-класса и эконом-класса. То же справедливо и для очередей печати и диспетчера потоков. У вас может быть массив списка очередей, где элемент массива означает приоритет. Внутри каждого элемента массива будет очередь, и обработка будет выполняться по принципу FIFO.
Очередь реализуется с помощью классов Queue из пространства имен System.Collections и Queue из пространства имен System.Collections.Generic.
В классе Queue определяются приведенные ниже конструкторы:
В первой форме конструктора создается пустая очередь с выбираемыми по умолчанию емкостью и коэффициентом роста 2.0. Во второй форме создается пустая очередь, первоначальный размер которой определяет емкость, задаваемая параметром capacity, а коэффициент роста по умолчанию выбирается для нее равным 2.0. В третьей форме допускается указывать не только емкость (в качестве параметра capacity), но и коэффициент роста создаваемой очереди (в качестве параметра growFactor в пределах от 1.0 до 10.0). И в четвертой форме создается очередь, состоящая из элементов указываемой коллекции col. Ее первоначальная емкость равна количеству указанных элементов, а коэффициент роста по умолчанию выбирается для нее равным 2.0.
В классе Queue определяются следующие конструкторы:
В первой форме конструктора создается пустая очередь с выбираемой по умолчанию первоначальной емкостью, а во второй форме — пустая очередь, первоначальный размер которой определяет параметр capacity. И в третьей форме создается очередь, содержащая элементы коллекции, определяемой параметром collection. Ее первоначальная емкость равна количеству указанных элементов.
Члены класса Queue представлены ниже:
Count
Свойство Count возвращает количество элементов в очереди.
Enqueue()
Метод Enqueue() добавляет элемент в конец очереди.
Dequeue()
Метод Dequeue() читает и удаляет элемент из головы очереди. Если на момент вызова метода Dequeue() элементов в очереди больше нет, генерируется исключение InvalidOperationException.
Peek()
Метод Peek() читает элемент из головы очереди, но не удаляет его.
TrimExcess()
Метод TrimExcess() изменяет емкость очереди. Метод Dequeue() удаляет элемент из очереди, но не изменяет ее емкости. TrimExcess() позволяет избавиться от пустых элементов в начале очереди.
Очередь. Пример обобщенной коллекции
Во многих приложениях требуется создавать группы связанных объектов и управлять ими. Существует два способа группировки объектов: создать массив объектов и создать коллекцию.
Массивы удобнее всего использовать для создания и работы с фиксированным числом строго типизированных объектов.
Коллекции предоставляют более гибкий способ работы с группами объектов. В отличие от массивов, коллекция, с которой вы работаете, может расти или уменьшаться динамически при необходимости.
Коллекция является классом, поэтому необходимо объявить экземпляр класса перед добавлением в коллекцию элементов.
Если коллекция содержит элементы только одного типа данных, можно использовать один из классов в пространстве имен. Универсальная коллекция обеспечивает строгую типизацию, так что в нее нельзя добавить другие типы данных.
Примером такой коллекции является очередь (FIFO-список). Рассмотрим ее более подробно.
Определение очереди
Очередь (queue) — это коллекция, в которой элементы обрабатываются по схеме «первый вошел, первый вышел» (first in, first out — FIFO).
Элемент, вставленный в очередь первым, первым же и читается.
Примеры очередей
Очередь в аэропорту, очередь претендентов на трудоустройство, очередь печати принтера либо циклическая очередь потоков на выделение ресурсов процессора.
Часто встречаются очереди, в которых элементы обрабатываются по-разному, в соответствии с приоритетом. Например, в очереди в аэропорту пассажиры бизнес-класса обслуживаются перед пассажирами экономкласса. Здесь может использоваться несколько очередей — по одной для каждого приоритета. В аэропорту это можно видеть наглядно, поскольку там предусмотрены две стойки регистрации для пассажиров бизнес-класса и эконом-класса. То же справедливо и для очередей печати и диспетчера потоков.
У вас может быть массив списка очередей, где элемент массива означает приоритет. Внутри каждого элемента массива будет очередь, и обработка будет выполняться по принципу FIFO.
Классы для работы с очередями
Очередь (queue) реализуется с помощью классов Queue из пространства имен System.Collections (набор необобщенных коллекций) и Queue из пространства имен System.Collections.Generic — библиотека обобщенных «универсальных» коллекций — она используется в примере.
В классе Queue определяются приведенные ниже конструкторы (в угловых скобках вместо Т указывается тип элемента очереди):
public Queue ()
public Queue (int capacity)
public Queue (ICollection col)
В первой форме конструктора создается пустая очередь с выбираемыми по умолчанию емкостью.
Во второй форме создается пустая очередь, первоначальный размер которой определяет емкость, задаваемая параметром capacity.
В третьей форме создается очередь, состоящая из элементов указываемой уже ранее созданной коллекции col.
Члены класса Queue :
Count. Свойство Count возвращает количество элементов в очереди.
Enqueue(). Метод Enqueue() добавляет элемент в конец очереди.
Dequeue(). Метод Dequeue() читает и удаляет элемент из головы очереди. Если на момент вызова метода Dequeue() элементов в очереди больше нет, генерируется исключение InvalidOperationException.
Peek(). Метод Peek() читает элемент из головы очереди, но не удаляет его.
TrimExcess(). Метод TrimExcess() изменяет емкость очереди.
Метод Dequeue() удаляет элемент из очереди, но не изменяет ее емкости. TrimExcess() позволяет избавиться от пустых элементов в начале очереди.
Пример очереди:
Результат:
Элементом очереди является структура Client (имя, возраст — добавляйте сюда все необходимое).
Обратите внимание, что сначала вызывается конструктор массива очередей, а затем в цикле уже вызывается конструктор каждой очереди.
После удаления первого элемента длина очереди уменьшается на 1.
Поэкспериментируйте с методами класса Queue .
C # очередь с примерами
Очередь используется для представления коллекции объектов «первым пришел — первым обслужен» (FIFO). Он используется, когда вам нужен доступ первым, первым и первым. Это неуниверсальный тип коллекции, который определен в пространстве имен System.Collections . Он используется для создания динамической коллекции, которая растет в соответствии с потребностями вашей программы. В очереди вы можете хранить элементы одного типа и разных типов. Как правило, очередь полезна, когда вы обращаетесь к этой информации таким же образом, каким они хранятся в коллекции, и это временное хранилище для хранения данных.
Приведенная ниже диаграмма иллюстрирует иерархию класса Queue:
Важные моменты:
- Класс Queue реализует интерфейсы IEnumerable , ICollection и ICloneable .
- Когда вы добавляете элемент в список, он называется постановкой в очередь .
- когда вы удаляете элемент, он называется dequeue .
- Очередь принимает значение NULL в качестве допустимого значения для ссылочных типов.
- Когда элементы добавляются в очередь, емкость автоматически увеличивается по мере необходимости путем перераспределения внутреннего массива.
- В очереди вы можете хранить дубликаты элементов.
- Емкость очереди — это количество элементов, которые может содержать очередь.
Как создать очередь?
Класс очереди имеет четыре конструктора, которые используются для создания очереди:
- Queue (): этот конструктор используется для создания экземпляра класса Queue, который пуст и имеет начальную емкость по умолчанию и использует коэффициент роста по умолчанию.
- Queue (ICollection): этот конструктор используется для создания экземпляра класса Queue, который содержит элементы, скопированные из указанной коллекции, имеет ту же начальную емкость, что и количество скопированных элементов, и использует коэффициент роста по умолчанию.
- Queue (Int32): этот конструктор используется для создания экземпляра класса Queue, который пуст и имеет заданную начальную емкость, и использует коэффициент роста по умолчанию.
- Очередь (Int32, Single): этот конструктор используется для создания экземпляра класса Queue, который пуст и имеет заданную начальную емкость, и использует указанный коэффициент роста.
Давайте посмотрим, как создать очередь с помощью конструктора Queue ():
Шаг 1: Включите пространство имен System.Collections в вашу программу с помощью ключевого слова.
Синтаксис:
Шаг 2. Создайте очередь, используя класс Queue, как показано ниже:
Шаг 3: Если вы хотите добавить элементы в свою очередь, используйте метод Enqueue () для добавления элементов в свою очередь. Как показано в примере ниже.
Круговая Очередь
Циклическая очередь позволяет избежать потери места в обычной реализации очереди с использованием массивов.
DeQueue — удаление элемента из очереди;
FRONT и REAR — два указателя, используемые для отслеживания первого и последнего элементов в очереди.
Как вы можете видеть на изображении выше, после некоторого количества добавления в очередь и удаления из очереди ее размер был уменьшен.
Индексы 0 и 1 могут использоваться только после сброса очереди, когда все элементы сняты.
Как работает круговая очередь
Циклическая очередь работает по процессу циклического приращения, то есть когда мы пытаемся увеличить любую переменную и достигаем конца очереди, мы начинаем с начала очереди по модулю деления с размером очереди.
Операции с очередями работают следующим образом:
- Два указателя, называемые FRONT и REAR, используются для отслеживания первого и последнего элементов в очереди.
- При инициализации очереди мы устанавливаем значение FRONT и REAR равным -1.
- При добавления элемента мы постепенно увеличиваем значение индекса REAR и помещаем новый элемент в положение, на которое указывает REAR.
- При снятии очереди с элемента мы возвращаем значение, на которое указывает FRONT, и постепенно увеличиваем индекс FRONT.
- Перед постановкой в очередь мы проверяем, заполнена ли очередь.
- Перед снятием очереди мы проверяем, пуста ли очередь.
- При инициализации первого элемента мы устанавливаем значение FRONT в 0.
- При удалении последнего элемента мы сбрасываем значения FRONT и REAR в -1.
Однако проверка на полную очередь имеет новый дополнительный пункт:
- Случай 1: FRONT = 0 && REAR == РАЗМЕР — 1
- Случай 2: ПЕРЕДНЯЯ = ЗАДНЯЯ + 1
Второй случай происходит, когда REAR начинается с 0 из-за кругового приращения, и когда его значение всего на 1 меньше значения FRONT, очередь заполнена.
Реализация циклической очереди на языке программирования
Наиболее распространенная реализация очереди использует массивы, но также может возможна реализация с использованием списков.
Реализация с использованием C-программирования
Когда вы запустите эту программу, получите следующее:
Реализация с использованием программирования на C ++
Когда вы запустите эту программу, получите следующее:
Рекомендуем хостинг TIMEWEB
По статье задано0 вопрос(ов)