Одним из самых характерных примеров объектно-ориентированного программирования служит класс, реализующий стек — структуру данных, воплощающую магазинный список, действующий по принципу "первым пришел — последним обслужен".
Для стека определены две основные операции: поместить данные в стек и извлечь их оттуда. Первая операция помещает значение на вершину стека, а вторая — извлекает значение из вершины стека. Следовательно, операция извлечения является безвозвратной: как только значение извлекается из стека, оно удаляется и уже недоступно в стеке.
//Клас для хранения символов в стеке.
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 IsFull()
{
return tos == stck.Length;
}
//возвратить значиние true, если стек пуст.
public bool IsEmpty()
{
return tos == 0;
}
//возвратить общую емкость стека.
public int Capacity()
{
return stck.Length;
}
//возвратить количество обьектов, находящихся в данный момент в стеке.
public int GetNum()
{
return tos;
}
}
class StackDemo
{
static void Main()
{
Stack stk1 = new Stack(10);
Stack stk2 = new Stack(10);
Stack stk3 = new Stack(10);
char ch;
int i;
//поместить ряд символов в стек stk1.
Console.WriteLine("Поместить символы A-J в стек stk1.");
for (i = 0;!stk1.IsFull(); i++) stk1.Push((char)('A' + i));
if (stk1.IsFull()) Console.WriteLine("Стек stk1 заполнен.");
//вывести содержимое стека stk1.
Console.Write("Содержимое стека stk1: ");
while (!stk1.IsEmpty())
{
ch = stk1.Pop();
Console.Write(ch);
}
Console.WriteLine();
if (stk1.IsEmpty()) Console.WriteLine("Стек stk1 пуст.\n");
//поместить дополнительные символы в стек stk1.
Console.WriteLine("Вновь поместить символы A-J в стек stk1.");
for (i = 0;!stk1.IsFull(); i++) stk1.Push((char)('A' + i));
//А теперь извлечь элементы из стека stk1 и поместить их в стек stk2.
//В итоге элементы сохраняются в стеке stk2 в обратном порядке.
Console.WriteLine("А теперь извлечь символы из стека stk1\n"
+ "и поместить их в стек stk2.");
while (!stk1.IsEmpty())
{
ch = stk1.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)('A' + i));
Console.WriteLine("Емкость стека stk3: " + stk3.Capacity());
Console.WriteLine("Количество обьектов в стеке stk3: " + stk3.GetNum());
}
}