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 IsFull() {  

return tos==stck.Length;

}

 

// Возвратить значение true, если стек пуст,  

public bool IsEmpty() {  

return tos==0;

}

 

// Возвратить общую емкость стека,  

public int Capacity() {

return stck.Length;

}

 

// Возвратить количество объектов, находящихся в данный момент в стеке,  

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(). Эти методы предоставляют всю необходимую информацию о состоянии стека и приведены ниже.

 

// Возвратить значение true, если стек заполнен,  

public bool IsFull() {  

return tos==stck.Length;

}

 

// Возвратить значение true, если стек пуст,  

public bool IsEmpty() {  

return tos==0;

}

 

// Возвратить общую емкость стека,  

public int Capacity() {

return stck.Length;

}

 

// Возвратить количество объектов, находящихся в данный момент в стеке,  

public int GetNum() {  

return tos;

}

 

Метод IsFull() возвращает логическое значение true, если стек заполнен, а иначе — логическое значение false. Метод IsEmpty() возвращает логическое значение true, если стек пуст, а иначе — логическое значение false. Для получения общей емкости стека (т.е. общего числа элементов, которые могут в нем храниться) достаточно вызвать метод Capacity(), а для получения количества элементов, хранящихся в настоящий момент в стеке, — метод GetNum(). Польза этих методов состоит в том, что для получения информации, которую они предоставляют, требуется доступ к закрытой переменной tos. Кроме того, они служат наглядными примерами организации безопасного доступа к закрытым членам класса с помощью открытых методов.

Конкретное применение класса Stack для реализации стека демонстрируется в приведенной ниже программе.

 

// Продемонстрировать применение класса Stack,  

 

using System;

 

// Класс для хранения символов в стеке.

 

class Stack {

// Эти члены класса являются закрытыми,  

char[] stck; // массив, содержащий стек  


Дата добавления: 2019-02-12; просмотров: 330; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!