Страница 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(" - Стек заполнен."); </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 (" - Стек пуст."); </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>