Страница 103 из 502
<b> Console.WriteLine(" - Стек заполнен."); </b>
<b> return;</b>
<b> }</b>
<b> stck[tos] = ch; </b>
<b> tos++;</b>
<b> }</b>
<b> // Извлечь символ из стека, </b>
<b> public char Pop() {</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>
<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>
<b>}</b>
<b>// Продемонстрировать применение класса Stack.</b>
<b>class StackDemo {</b>
<b> static void Main() {</b>
<b> Stack stk1 = new Stack(10); </b>
<b> char ch; </b>
<b> int i;</b>
<b> // Поместить ряд символов в стек stk1.</b>
<b> Console.WriteLine("Поместить символы А-J в стек stk1."); </b>
<b> for(i=0; !stk1.IsFull(); i++)</b>
<b> stk1.Push((char) ('A' + i));</b>
<b> // Создать копию стека stck1.</b>
<b> Stack stk2 = new Stack(stk1);</b>
<b> // Вывести содержимое стека stk1.</b>
<b> Console.Write("Содержимое стека stk1: "); </b>
<b> while ( !stk1.IsEmpty() ) {</b>
<b> ch = stk1.Pop();</b>
<b> Console.Write(ch);</b>
<b> }</b>
<b> Console.WriteLine();</b>
<b> Console.Write("Содержимое стека stk2: "); </b>
<b> while ( !stk2.IsEmpty() ) {</b>
<b> ch = stk2.Pop();</b>
<b> Console.Write(ch);</b>
<b> }</b>
<b> Console.WriteLine ("n");</b>
<b> }</b>
<b>}</b>
Результат выполнения этой программы приведен ниже.
<b>Поместить символы А-J в стек stk1.</b>
<b>Содержимое стека stk1: JIHGFEDCBA </b>
<b>Содержимое стека stk2: JIHGFEDCBA</b>
В классе StackDemo сначала конструируется первый стек (stk1), заполняемый символами. Затем этот стек используется, для конструирования второго стека (stk2). Это приводит к выполнению следующего конструктора класса Stack.
<b>// Сконструировать объект класса Stack из существующего стека, </b>
<b>public Stack(Stack ob) {</b>
<b> // Распределить память для стека, </b>
<b> stck = new char[ob.stck.Length];</b>
<b> // Скопировать элементы в новый стек, </b>
<b> for (int i=0; i < ob.tos; i++) </b>
<b> stck[i] = ob.stck[i];</b>
<b> // Установить переменную tos для нового стека, </b>
<b> tos = ob.tos;</b>
<b>}</b>
В этом конструкторе сначала распределяется достаточный объем памяти для массива, чтобы хранить в нем элементы стека, передаваемого в качестве аргумента ob. Затем содержимое массива, образующего стек ob, копируется в новый массив, после чего соответственно устанавливается переменная tos, содержащая индекс вершины стека. По завершении работы конструктора новый и исходный стеки существуют как отдельные, хотя и одинаковые объекты.