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

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

<b>// Построить пустой класс Stack для реализации стека заданного размера, </b>

<b>public Stack(int size) {</b>

<b>  stck = new char[size]; // распределить память для стека </b>

<b>  tos = 0;</b>

<b>}</b>

Этому конструктору передается требуемый размер стека. Он распределяет память для базового массива и устанавливает значение переменной tos в нуль. Следовательно, нулевое значение переменной tos указывает на то, что стек пуст.

Открытый метод Push() помещает конкретный элемент в стек, как показано ниже.

<b>// Поместить символы в стек, </b>

<b>public void Push(char ch) { </b>

<b>  if (tos==stck.Length) {</b>

<b>    Console.WriteLine(&quot; - Стек заполнен.&quot;); </b>

<b>    return;</b>

<b>  }</b>

<b>  stck[tos] = ch; </b>

<b>  tos++;</b>

<b>}</b>

Элемент, помещаемый в стек, передается данному методу в качестве параметра ch. Перед тем как поместить элемент в стек, выполняется проверка на наличие свободного места в базовом массиве, а именно: не превышает ли значение переменной tos длину массива stck. Если свободное место в массиве stck есть, то элемент сохраняется в нем по индексу, хранящемуся в переменной tos, после чего значение этой переменной инкрементируется. Таким образом, в переменной tos всегда хранится индекс следующего свободного элемента массива stck.

Для извлечения элемента из стека вызывается открытый метод Pop(), приведенный ниже.

<b>// Извлечь символ из стека, </b>

<b>public char Рор() { </b>

<b>  if(tos==0) {</b>

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

<b>    return (char) 0;</b>

<b>  }</b>

<b>  tos-- ;</b>

<b>  return stck[tos];</b>

<b>}</b>

В этом методе сначала проверяется значение переменной tos. Если оно равно нулю, значит, стек пуст. В противном случае значение переменной tos декрементируется, и затем из стека возвращается элемент по указанному индексу.

Несмотря на то что для реализации стека достаточно методов Push() и Pop(), полезными могут оказаться и другие методы. Поэтому в классе Stack определены еще четыре метода: IsFull(), IsEmpty(), Capacity() и GetNum(). Эти методы предоставляют всю необходимую информацию о состоянии стека и приведены ниже.

<b>// Возвратить значение true, если стек заполнен, </b>

<b>public bool IsFull() { </b>

<b>  return tos==stck.Length;</b>

<b>}</b>

<b>// Возвратить значение true, если стек пуст, </b>

<b>public bool IsEmpty() { </b>

<b>  return tos==0;</b>

<b>}</b>

<b>// Возвратить общую емкость стека, </b>

<b>public int Capacity() {</b>

<b>  return stck.Length;</b>

<b>}</b>

<b>// Возвратить количество объектов, находящихся в данный момент в стеке, </b>

<b>public int GetNum() { </b>

<b>  return tos;</b>

<b>}</b>

Метод IsFull() возвращает логическое значение true, если стек заполнен, а иначе — логическое значение false. Метод IsEmpty() возвращает логическое значение true, если стек пуст, а иначе — логическое значение false. Для получения общей емкости стека (т.е. общего числа элементов, которые могут в нем храниться) достаточно вызвать метод Capacity(), а для получения количества элементов, хранящихся в настоящий момент в стеке, — метод GetNum(). Польза этих методов состоит в том, что для получения информации, которую они предоставляют, требуется доступ к закрытой переменной tos. Кроме того, они служат наглядными примерами организации безопасного доступа к закрытым членам класса с помощью открытых методов.

Конкретное применение класса Stack для реализации стека демонстрируется в приведенной ниже программе.

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

<b>using System;</b>

<b>// Класс для хранения символов в стеке.</b>

<b>class Stack {</b>

<b>  // Эти члены класса являются закрытыми, </b>

<b>  char[] stck; // массив, содержащий стек </b>