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

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

<b>      Console.WriteLine(&quot; - Стек заполнен.&quot;); </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 (&quot; - Стек пуст.&quot;); </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(&quot;Поместить символы А-J в стек stk1.&quot;); </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(&quot;Содержимое стека stk1: &quot;); </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(&quot;Содержимое стека stk2: &quot;); </b>

<b>    while ( !stk2.IsEmpty() ) {</b>

<b>      ch = stk2.Pop();</b>

<b>      Console.Write(ch);</b>

<b>    }</b>

<b>    Console.WriteLine (&quot;n&quot;);</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 &lt; ob.tos; i++) </b>

<b>    stck[i] = ob.stck[i];</b>

<b>  // Установить переменную tos для нового стека, </b>

<b>  tos = ob.tos;</b>

<b>}</b>

В этом конструкторе сначала распределяется достаточный объем памяти для массива, чтобы хранить в нем элементы стека, передаваемого в качестве аргумента ob. Затем содержимое массива, образующего стек ob, копируется в новый массив, после чего соответственно устанавливается переменная tos, содержащая индекс вершины стека. По завершении работы конструктора новый и исходный стеки существуют как отдельные, хотя и одинаковые объекты.