Конкретное применение класса Stack для реализации стека демонстрируется в приведенной ниже программе.
// Продемонстрировать применение класса Stack, using System;
// Класс для хранения символов в стеке, class Stack {
// Эти члены класса являются закрытыми, char[] stck; // массив, содержащий стек int tos; // индекс вершины стека
// Построить пустой класс Stack для реализации стека заданного размера, public Stack(int size) {
stck = new char[size]; // распределить память для стека tos = 0;
}
// Поместить символы в стек, public void Push(char ch) { if(tos==stck.Length) {
Console.WriteLine (" - Стек заполнен."); return;
}
stck[tos] = ch; tos++;
}
// Извлечь символ из стека, public char Pop() {
if(tos==0) {
Console.WriteLine(" - Стек пуст."); return (char) 0;
}
Tos — ;
return stck[tos];
}
// Возвратить значение true, если стек заполнен, public bool IsFullO { return tos==stck.Length;
}
// Возвратить значение true, если- стек пуст, public bool IsEmptyO {
return tos==0;
}
// Возвратить общую емкость стека, public int Capacity() {
Return stck.Length;
}
// Возвратить количество объектов, находящихся в данный момент в стеке, public int GetNum() { return tos;
}
}
class StackDemo {
static void Main() {
Stack stkl = new Stack (10);
Stack stk2 = new Stack(lO);
Stack stk3 = new Stack(10);
Char ch; int i;
// Поместить ряд символов в стек stkl.
Console.WriteLine("Поместить символы А-J в стек stkl."); for(i=0; !stkl.IsFull(); i++) stkl.Push((char) ('A1 + i));
if(stkl.IsFull()) Console.WriteLine("Стек stkl заполнен.");
// Вывести содержимое стека stkl.
Console.Write("Содержимое стека stkl: "); while( !stkl.IsEmpty() ) {
ch = stkl.Pop();
Console.Write(ch);
}
Console.WriteLine();
if(stkl.IsEmpty()) Console.WriteLine("Стек stkl пуст.\п");
// Поместить дополнительные символы в стек stkl.
Console.WriteLine("Вновь поместить символы А-J в стек stkl."); for(i=0; !stkl.IsFull(); i++) stkl.Push((char) ('A' + i));
// А теперь извлечь элементы из стека stkl и поместить их в стек stk2. // В итоге элементы сохраняются в стеке stk2 в обратном порядке. Console.WriteLine("А теперь извлечь символы из стека stkl\n" +
"и поместить их в стек stk2."); while( !stkl.IsEmpty() ) {
ch = stkl.Pop(); stk2.Push(ch);
Console.Write("Содержимое стека stk2: "); while( !stk2.IsEmpty() ) {
ch = stk2.Pop();
Console.Write(ch);
}
Console.WriteLine("\n");
// Поместить 5 символов в стек.
Console.WriteLine("Поместить 5 символов в стек stk3."); for(i=0; i < 5; i++)
stk3.Push((char) ('A1 + i)) ;
Console.WriteLine("Емкость стека stk3: " + stk3.Capacity()); Console.WriteLine("Количество объектов в стеке stk3: " + stk3.GetNum());
}
}
При выполнении этой программы получается следующий результат.
Поместить символы А-J в стек stkl.
Стек stkl заполнен.
Содержимое стека stkl: JIHGFEDCBA Стек stkl пуст.
Вновь поместить символы А-J в стек stkl.
А теперь извлечь символы из стека stkl и поместить их в стек stk2.
Содержимое стека stk2: ABCDEFGHIJ
Поместить 5 символов в стек stk3.
Емкость стека stk3: 10 Количество объектов в стеке stk3: 5
Передача объектов методам по ссылке
В приведенных до сих пор примерах программ при указании параметров, передаваемых методам, использовались типы значений, например int или double. Но в методах можно также использовать параметры ссылочного типа, что не только правильно, но и весьма распространено в ООП. Подобным образом объекты могут передаваться методам по ссылке. В качестве примера рассмотрим следующую программу.
// Пример передачи объектов методам по ссылке.
Using System;
class MyClass { int alpha, beta;
public MyClass(int i, int j) { alpha = i; beta = j;
// Возвратить значение true, если параметр ob // имеет те же значения, что и вызывающий объект, public bool SameAs(MyClass ob) {
if ((ob.alpha == alpha) & (ob.beta == beta)) return true; else return false;
}
// Сделать копию объекта ob. public void Copy(MyClass ob) { alpha = ob.alpha; beta = ob.beta;
}
public void Show() {
Console.WriteLine("alpha: {0}, beta: {1}", alpha, beta);
}
}
class PassOb {
static void Main() {
MyClass obi = new MyClass(4, 5);
MyClass ob2 = new MyClass (6, 7);
Console.Write("obi: "); obi.Show ();
Console.Write("ob2: "); ob2.Show();
If(obi.SameAs(ob2))
Console.WriteLine("obi и ob2 имеют одинаковые значения."); else
Console.WriteLine("obi и ob2 имеют разные значения."); Console.WriteLine() ;
// А теперь сделать объект obi копией объекта ob2. obi.Copy(ob2);
Console.Write("obi после копирования: "); obi.Show();
If(obi.SameAs(ob2) )
Console.WriteLine("obi и ob2 имеют одинаковые значения."); else
Console.WriteLine("obi и ob2 имеют разные значения.");
}
}