Добавить в цитаты Настройки чтения

Страница 454 из 502

<b>    ShowPush(st, 22);</b>

<b>    ShowPush(st, 65);</b>

<b>    ShowPush(st, 91);</b>

<b>    ShowPop(st);</b>

<b>    ShowPop(st);</b>

<b>    ShowPop(st) ;</b>

<b>    try {</b>

<b>      ShowPop(st) ;</b>

<b>    } catch (InvalidOperationException) {</b>

<b>      Console.WriteLine(&quot;Стек пуст.&quot;);</b>

<b>    }</b>

<b>  }</b>

<b>}</b>

Ниже приведен результат выполнения этой программы. Обратите внимание на то, как обрабатывается исключение InvalidOperationException, генерируемое при попытке извлечь элемент из пустого стека.

<b>Поместить в стек: Push(22)</b>

<b>Содержимое стека: 22</b>

<b>Поместить в стек: Push(65)</b>

<b>Содержимое стека: 65 22</b>

<b>Поместить в стек: Push(91)</b>

<b>Содержимое стека: 91 65 22</b>

<b>Извлечь из стека: Pop -&gt; 91</b>

<b>Содержимое стека: 65 22</b>

<b>Извлечь из стека: Pop -&gt; 65</b>

<b>Содержимое стека: 22</b>

<b>Извлечь из стека: Pop -&gt; 22</b>

<b>Содержимое стека:</b>

<b>Извлечь из стека: Pop -&gt; Стек пуст.</b>

Еще одной распространейной структурой данных является очередь, действующая по принципу: первым пришел — первым обслужен. Это означает, что первым из очереди извлекается элемент, помещенный в нее первым. Очереди часто встречаются в реальной жизни. Многим из нас нередко приходилось стоять в очередях к кассе в банке, магазине или столовой. В программировании очереди применяются для хранения таких элементов, как процессы, выполняющиеся в данный момент в системе, списки приостановленных транзакций в базе данных или пакеты данных, полученные по Интернету. Кроме того, очереди нередко применяются в области имитационного моделирования.

Класс коллекции, поддерживающий очередь, носит название Queue. В нем реализуются интерфейсы ICollection, IEnumerable и ICloneable. Этот класс создает динамическую коллекцию, которая расширяется, если в ней необходимо хранить вводимые элементы. Так, если в очереди требуется свободное место, ее размер увеличивается на коэффициент роста, который по умолчанию равен 2,0.

В классе Queue определяются приведенные ниже конструкторы.

<b>public Queue()</b>

<b>public Queue (int <i>capacity)</i></b>

<b>public Queue (int <i>capacity,</i> float <i>growFactor)</i></b>

<b>public Queue (ICollection <i>col)</i></b>

В первой форме конструктора создается пустая очередь с выбираемыми по умолчанию емкостью и коэффициентом роста 2,0. Во второй форме создается пустая очередь, первоначальный размер которой определяет емкость, задаваемая параметром capacity, а коэффициент роста по умолчанию выбирается для нее равным 2,0. В третьей форме допускается указывать не только емкость (в качестве параметра capacity), но и коэффициент роста создаваемой очереди (в качестве параметра growFactor в пределах от 1,0 до 10,0). И в четвертой форме создается очередь, состоящая из элементов указываемой коллекции col. Ее первоначальная емкость равна количеству указанных элементов, а коэффициент роста по умолчанию выбирается для нее равным 2,0.

В классе Queue определяется ряд собственных методов, помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются. Некоторые из наиболее часто используемых методов этого класса перечислены в табл. 25.8. Эти методы обычно применяются следующим образом. Для того чтобы поместить объект в очередь, вызывается метод Enqueue(). Если требуется извлечь и удалить первый объект из начала очереди, то вызывается метод Dequeue(). Если же требуется извлечь, но не удалять следующий объект из очереди, то вызывается метод Реек(). А если методы Dequeue() и Реек() вызываются, когда очередь пуста, то генерируется исключение InvalidOperationException.

Таблица 25.8. Наиболее часто используемые методы, определенные в классе Queue

Метод - Описание

public virtual void Clear() - Устанавливает свойство Count равным нулю, очищая, по существу, очередь

public virtual bool Contains(object obj) - Возвращает логическое значение true, если объект obj содержится в вызывающей очереди, а иначе — логическое значение false

public virtual object Dequeue() - Возвращает объект из начала вызывающей очереди. Возвращаемый объект удаляется из очереди

public virtual void Enqueue(object obj) - Добавляет объект obj в конец очереди 

public virtual object Peek() - Возвращает объект из начала вызывающей очереди, но не удаляет его

public static Queue Synchronized(Queue queue) - Возвращает синхронизированный вариант коллекции типа Queue, передаваемой в качестве параметра queue

public virtual object[] ToArray() - Возвращает массив, который содержит копии элементов из вызывающей очереди

public virtual void TrimToSize() -  Устанавливает значение свойства Capacity равным значению свойства Count

В приведенном ниже примере программы демонстрируется применение класса

Queue.

<b>// Продемонстрировать применение класса Queue.</b>

<b>using System;</b>

<b>using System.Collections;</b>