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