Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка2.doc
Скачиваний:
34
Добавлен:
13.02.2015
Размер:
1.4 Mб
Скачать

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

namespace MyStack

{

#include <vector>

#include <SysUtils.hpp>

using namespace std;

#define EStackError Exception

#define EStackOverflow EStackError

#define EStackEmpty EStackError

template <class T>

classTStack

{

private:

int Top;

int Size;

vector<T> Items;

public:

TStack(int MaxSize = 2147483647);

void Push(T Value);

T Pop();

T Peek();

bool Empty();

boolFull();

voidClear();

};

};

Класс 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>

voidTStack<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>

boolTStack<T>::Empty()

{

return Top == -1;

}

template<class T>

boolTStack<T>::Full()

{

return Top == Size - 1;

}

template<class T>

voidTStack<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. Последовательно извлекая символы из стека, сравнивают их с символами преобразованной строки. Если они все совпали, то исходная строка является палиндромом, в противном случае – нет.

Например,

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

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

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

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