Класс коллекции, поддерживающий стек, носит название Stack. В нем реализуются интерфейсы ICollection, IEnumerable и ICloneable. Этот класс создает динамическую коллекцию, которая расширяется по мере потребности хранить в ней вводимые элементы. Всякий раз, когда требуется расширить такую коллекцию, ее емкость увеличивается вдвое.
В классе Stack определяются следующие конструкторы.
public Stack()
public Stack(int initialCapacity) public Stack(ICollection col)
В первой форме конструктора создается пустой стек, во второй форме — пустой стек, первоначальный размер которого определяет первоначальная емкость, задаваемая параметром initialCapacity, ив третьей форме — стек, содержащий элементы указываемой коллекции col. Его первоначальная емкость равна количеству указанных элементов.
В классе Stack определяется ряд собственных методов, помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются. Некоторые из наиболее часто используемых методов этого класса приведены в табл. 25.7. Эти методы обычно применяются следующим образом. Для того чтобы поместить объект на вершине стека, вызывается метод Push (). А для того чтобы извлечь и удалить объект из вершины стека, вызывается метод Pop (). Если же объект требуется только извлечь, но не удалить из вершины стека, то вызывается метод Реек (). А если вызвать метод Pop () или Реек (), когда вызывающий стек пуст, то сгенерируется исключение InvalidOperationException.
Таблица 25.7. Наиболее часто используемые методы, определенные в классе Stack
Метод
Описание
public virtual void Clear ()
public virtual bool Contains (object obj)
public virtual object Peek()
public virtual object Pop()
public virtual void Push (object obj) public static Stack Synchronized(Stack stack)
public virtual object[] ToArray()
Устанавливает свойство Count равным нулю, очищая, по существу, стек
Возвращает логическое значение true, если объект obj содержится в вызывающем стеке, а иначе — логическое значение false Возвращает элемент, находящийся на вершине стека, но не удаляет его
Возвращает элемент, находящийся на вершине стека, удаляя его по ходу дела Помещает объект obj в стек
Возвращает синхронизированный вариант коллекции типа Stack, передаваемой в качестве параметра stack
Возвращает массив, содержащий копии элементов вызывающего стека
В приведенном ниже примере программы создается стек, в который помещается несколько целых значений, а затем они извлекаются обратно из стека.
// Продемонстрировать применение класса Stack.
using System;
using System.Collections;
class StackDemo {
static void ShowPush(Stack st, int a) { st.Push(a);
Console.WriteLine("Поместить в стек: Push(" + a + ")"); Console.Write("Содержимое стека: "); foreach(int i in st)
Console.Write(i + " ");
Console.WriteLine();
}
static void ShowPop(Stack st) {
Console.Write("Извлечь из стека: Pop -> "); int a = (int) st.PopO;
Console.WriteLine(а);
Console.Write("Содержимое стека: "); foreach(int i in st)
Console.Write(i + " ");
Console.WriteLine();
}
static void Main() {
Stack st = new Stack ();
foreach(int i in st)
Console.Write(i + " ");
Console.WriteLine();
ShowPush(st, 22);
ShowPush(st, 65);
ShowPush(st, 91);
ShowPop(st);
ShowPop(st);
ShowPop(st) ;
try {
ShowPop(st) ;
} catch (InvalidOperationException) { Console.WriteLine("Стек пуст.");
}
} .
}
Ниже приведен результат выполнения этой программы. Обратите внимание на то, как обрабатывается исключение InvalidOperationException, генерируемое при попытке извлечь элемент из пустого стека.
Поместить в стек: Push(22)
Содержимое стека: 22 Поместить в стек: Push(65)
Содержимое стека: 65 22 Поместить в стек: Push (91)
Содержимое стека: 91 65 22 Извлечь из стека: Pop -> 91 Содержимое стека: 65 22 Извлечь из стека: Pop -> 65 Содержимое стека: 22 Извлечь из стека: Pop -> 22 Содержимое стека:
Извлечь из стека: Pop -> Стек пуст.