Герберт Шилдт - C# 4.0 полное руководство - 2011
- Название:C# 4.0 полное руководство - 2011
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Герберт Шилдт - C# 4.0 полное руководство - 2011 краткое содержание
C# 4.0 полное руководство - 2011 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
// Возвратить количество объектов, находящихся в данный момент в стеке, public int GetNum() { return tos;
}
}
Рассмотрим класс Stack более подробно. В начале этого класса объявляются две следующие переменные экземпляра.
// Эти члены класса являются закрытыми, char[] stck; // массив, содержащий стек int tos; // индекс вершины стека
Массив stck предоставляет базовые средства для хранения данных в стеке (в данном случае — символов). Обратите внимание на то, что память для этого массива не распределяется. Это делается в конструкторе класса Stack. А член tos данного класса содержит индекс вершины стека.
Оба члена, tosnstck, являются закрытыми, и благодаря этому соблюдается принцип "последним пришел — первым обслужен". Если же разрешить открытый доступ к члену stck, то элементы стека окажутся доступными не по порядку. Кроме того, член tos содержит индекс вершины стека, где находится первый обслуживаемый в стеке элемент, и поэтому манипулирование членом tos в коде, находящемся за пределами класса Stack, следует исключить, чтобы не допустить разрушение самого стека. Но в то же время члены stckntos доступны пользователю класса Stack косвенным образом с помощью различных отрытых методов, описываемых ниже.
Рассмотрим далее конструктор класса Stack.
// Построить пустой класс Stack для реализации стека заданного размера, public Stack(int size) {
stck = new char[size]; // распределить память для стека tos = 0;
}
Этому конструктору передается требуемый размер стека. Он распределяет память для базового массива и устанавливает значение переменной tos в нуль. Следовательно, нулевое значение переменной tos указывает на то, что стек пуст.
Открытый метод Push () помещает конкретный элемент в стек, как показано ниже.
// Поместить символы в стек, public void Push(char ch) { if (tos==stck.Length) {
Console.WriteLine(" - Стек заполнен."); return;
}
stck[tos] = ch; tos++;
Элемент, помещаемый в стек, передается данному методу в качестве параметра ch. Перед тем как поместить элемент в стек, выполняется проверка на наличие свободного места в базовом массиве, а именно: не превышает ли значение переменной tos длину массива stck. Если свободное место в массиве stck есть, то элемент сохраняется в нем по индексу, хранящемуся в переменной tos, после чего значение этой переменной инкрементируется. Таким образом, в переменной tos всегда хранится индекс следующего свободного элемента массива stck.
Для извлечения элемента из стека вызывается открытый метод Pop (), приведенный ниже.
// Извлечь символ из стека, public char Рор() { if(tos==0) {
Console.WriteLine (" - Стек пуст."); return (char) 0;
}
tos — ;
return stck[tos];
}
В этом методе сначала проверяется значение переменной tos. Если оно равно нулю, значит, стек пуст. В противном случае значение переменной tos декрементируется, и затем из стека возвращается элемент по указанному индексу.
Несмотря на то что для реализации стека достаточно методов Push () и Pop (), полезными могут оказаться и другие методы. Поэтому в классе Stack определены еще четыре метода: IsFull (), IsEmpty (), Capacity () и GetNum (). Эти методы предоставляют всю необходимую информацию о состоянии стека и приведены ниже.
return tos;
}
Метод IsFull () возвращает логическое значение true, если стек заполнен, а иначе — логическое значение false. Метод IsEmpty () возвращает логическое значение true, если стек пуст, а иначе — логическое значение false. Для получения общей емкости стека (т.е. общего числа элементов, которые могут в нем храниться) достаточно вызвать метод Capacity (), а для получения количества элементов, хранящихся в настоящий момент в стеке, — метод Get Num () . Польза этих методов состоит в том, что для получения информации, которую они предоставляют, требуется доступ к закрытой переменной tos. Кроме того, они служат наглядными примерами организации безопасного доступа к закрытым членам класса с помощью открытых методов.
Конкретное применение класса 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) ('A 1 + 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() ) {
Читать дальшеИнтервал:
Закладка: