Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Синтаксис объявления класса TStack




namespace MyStack

{

#include <vector>

#include <SysUtils.hpp>

using namespace std;

#define EStackError Exception

#define EStackOverflow EStackError

#define EStackEmpty EStackError

template <class T>

class TStack

{

private:

int Top;

int Size;

vector<T> Items;

public:

TStack(int MaxSize = 2147483647);

void Push(T Value);

T Pop();

T Peek();

bool Empty();

bool Full();

void Clear();

};

};

Класс TStack является шаблонным классом и содержит три поля для хранения вершины стека Top, его размера Size и списка элементов Items, конструктор TStack, который задает максимальный размер списка элементов, три метода для работы со стеком Push, Pop и Peek, процедуру очистки списка элементов Clear, а также две функции проверки пустого стека Empty и полностью заполненного Full.

В модуле с данным классом можно определить три класса исключительных ситуаций EStackError, EStackOverflow и EStackEmpty для обработки ошибок, которые могут возникать при работе со стеком.

#define EStackError Exception

#define EStackOverflow EStackError

#define EStackEmpty EStackError

Чтобы использовать эти классы, в заголовочном разделе модуля с расширением h необходимо подключить модуль SysUtils.hpp, в котором хранить базовый класс исключительных ситуаций Exception.

После объявления класса TStack необходимо определить все его методы в заголовочном разделе модуля с расширением h в соответствии с ADT – форматом, поместив их и сам класс в новое пространство имен MyStack так, как имя класса TStack пересекается со стандартным классом среды Code Gear.

template <class T>

TStack<T>::TStack(int MaxSize)

{

if (MaxSize < 1)

throw EStackError("Размер стека меньше единицы");

Size = MaxSize;

Top = -1;

}

 

template <class T>

void TStack<T>::Push(T Value)

{

if (Full())

throw EStackOverflow("Переполнение стека");

Top++;

Items.push_back(Value);

}

 

template <class T>

T TStack<T>::Pop()

{

if (Empty())

throw EStackEmpty("Стек пустой");

T Result = Items[Top];

Items.pop_back();

Top--;

return Result;

}

 

template <class T>

T TStack<T>::Peek()

{

if (Empty())

throw EStackEmpty("Стек пустой");

return Items[Top];

}

 

template <class T>

bool TStack<T>::Empty()

{

return Top == -1;

}

 

template <class T>

bool TStack<T>::Full()

{

return Top == Size - 1;

}

 

template <class T>

void TStack<T>::Clear()

{

Items.сlear();

Top = -1;

}

После того, как определен класс TStack в пространстве имен MyStack, его можно использовать в любом месте программы, подключив соответствующий модуль.

void __fastcall TForm1::Button1Click(TObject *Sender)

{

MyStack::TStack<char> Stack;

Stack.Push('К');

Stack.Push('О');

Stack.Push('Т');

Edit1->Text = "";

while (!Stack.Empty())

Edit1->Text = Edit1->Text + Stack.Pop(); //Text=ТОК

}

Стек является одной из широко используемых структур данных во всех языках программирования. С его помощью осуществляется вызов функций и методов, передача им значений переменных, объявленных в списке параметров и возвращение результата выполнения функции. Он применяется для упорядочивания элементов массивов, построения способов прохождения деревьев, приведения десятичного числа к заданной системе счисления и т.д.

Наиболее ярким примером использования стека является нахождение палиндромов – последовательности символов, одинаково читаемой как слева на право, так и наоборот. Алгоритм этого процесса организуется следующим образом:

1. Из исходной строки удаляются все служебные символы и знаки препинания.

2. Все символы очищенной строки приводится к одному регистру.

3. Преобразованная строка помещается в стек.

4. Последовательно извлекая символы из стека, сравнивают их с символами преобразованной строки. Если они все совпали, то исходная строка является палиндромом, в противном случае – нет.

Например,

 

А роза упала на лапу Азора. // Исходная строка

Арозаупаланалапуазора // Очищенная строка

арозаупаланалапуазора // Преобразованная строка к нижнему регистру

арозаупаланалапуазора // Строка из стека



Поделиться:

Дата добавления: 2015-08-05; просмотров: 117; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.006 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты