C# 4.0 полное руководство - 2011
Шрифт:
ShowPush(st, 65);
ShowPush(st, 91);
ShowPop(st);
ShowPop(st);
ShowPop(st) ;
try {
ShowPop(st) ;
} catch (InvalidOperationException) { Console.WriteLine("Стек пуст.");
}
} .
}
Ниже приведен результат выполнения этой программы. Обратите внимание на то, как обрабатывается исключение InvalidOperationException, генерируемое при попытке извлечь элемент из пустого стека.
Поместить в стек: Push(22)
Содержимое
Содержимое стека: 65 22 Поместить в стек: Push (91)
Содержимое стека: 91 65 22 Извлечь из стека: Pop -> 91 Содержимое стека: 65 22 Извлечь из стека: Pop -> 65 Содержимое стека: 22 Извлечь из стека: Pop -> 22 Содержимое стека:
Извлечь из стека: Pop -> Стек пуст.
Класс Queue
Еще одной распространейной структурой данных является очередь, действующая по принципу: первым пришел — первым обслужен. Это означает, что первым из очереди извлекается элемент, помещенный в нее первым. Очереди часто встречаются в
реальной жизни. Многим из нас нередко приходилось стоять в очередях к кассе в банке, магазине или столовой. В программировании очереди применяются для хранения таких элементов, как процессы, выполняющиеся в данный момент в системе, списки приостановленных транзакций в базе данных или пакеты данных, полученные по Интернету. Кроме того, очереди нередко применяются в области имитационного моделирования.
Класс коллекции, поддерживающий очередь, носит название Queue. В нем реализуются интерфейсы ICollection, IEnumerable и ICloneable. Этот класс создает динамическую коллекцию, которая расширяется, если в ней необходимо хранить вводимые элементы. Так, если в очереди требуется свободное место, ее размер увеличивается на коэффициент роста, который по умолчанию равен 2,0.
В классе Queue определяются приведенные ниже конструкторы.
public Queue
public Queue (int capacity)
public Queue (int capacity, float growFactor) public Queue (ICollection col)
В первой форме конструктора создается пустая очередь с выбираемыми по умолчанию емкостью и коэффициентом роста 2,0. Во второй форме создается пустая очередь, первоначальный размер которой определяет емкость, задаваемая параметром capaci ty, а коэффициент роста по умолчанию выбирается для нее равным 2,0. В третьей форме допускается указывать не только емкость (в качестве параметра capaci ty), но и коэффициент роста создаваемой очереди (в качестве параметра growFactor в пределах от 1,0 до 10,0). И в четвертой форме создается очередь, состоящая из элементов указываемой коллекции col. Ее первоначальная емкость равна количеству указанных элементов, а коэффициент роста по умолчанию выбирается для нее равным 2,0.
В классе Queue определяется ряд собственных методов, помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются. Некоторые из наиболее часто используемых методов этого класса перечислены в табл. 25.8.
Таблица 25.8. Наиболее часто используемые методы, определенные в классе Queue
Метод
Описание
public virtual void Clear
public virtual bool Contains(object obj)
public virtual object Dequeue
public virtual void Enqueue(object obj)
Устанавливает свойство Count равным нулю, очищая, по существу, очередь
Возвращает логическое значение true, если объект obj содержится в вызывающей очереди, а иначе — логическое значение false Возвращает объект из начала вызывающей очереди. Возвращаемый объект удаляется из очереди Добавляет объект obj в конец очереди
Окончание табл. 25.8
Метод
Описание
public virtual object Peek
public static Queue Synchronized(Queue queue)
public virtual object[] ToArray
public virtual void TrimToSize
Возвращает объект из начала вызывающей очереди, но не удаляет его
Возвращает синхронизированный вариант коллекции типа Queue, передаваемой в качестве параметра queue
Возвращает массив, который содержит копии элементов из вызывающей очереди Устанавливает значение свойства Capacity равным значению свойства Count
В приведенном ниже примере программы демонстрируется применение класса
Queue.
// Продемонстрировать применение класса Queue.
using System;
using System.Collections;
class QueueDemo {
static void ShowEnq(Queue q, int a) { q.Enqueue(a) ;
Console.WriteLine("Поместить в очередь: Enqueue(" + a + ")");
Console.Write("Содержимое очереди: "); foreach(int i in q)
Console.Write(i + " ");
Console.WriteLine ;
}
static void ShowDeq(Queue q) {
Console.Write("Извлечь из очереди: Dequeue -> "); int a = (int) q.Dequeue;
Console.WriteLine(a);
Console.Write("Содержимое очереди: "); foreach(int i in q)
Console.Write(i + " ") ;
Console.WriteLine;
}
static void Main {
Queue q = new Queue;
foreach(int i in q)
Console.Write(i + " ");
ShowEnq(q, 22);
ShowEnq(q, 65);
ShowEnq(q, 91);