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

Страница 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(&quot;Поместить в стек: Push(&quot; + a + &quot;)&quot;);</b>

<b>    Console.Write(&quot;Содержимое стека: &quot;);</b>

<b>    foreach(int i in st)</b>

<b>      Console.Write(i + &quot; &quot;);</b>

<b>    Console.WriteLine();</b>

<b>  }</b>

<b>  static void ShowPop(Stack st) {</b>

<b>    Console.Write(&quot;Извлечь из стека: Pop -&gt; &quot;);</b>

<b>    int a = (int) st.Pop();</b>

<b>    Console.WriteLine(а);</b>

<b>    Console.Write(&quot;Содержимое стека: &quot;);</b>

<b>    foreach(int i in st)</b>

<b>      Console.Write(i + &quot; &quot;);</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 + &quot; &quot;);</b>

<b>    Console.WriteLine();</b>