КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Синтаксис объявления класса TStacknamespace 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. Последовательно извлекая символы из стека, сравнивают их с символами преобразованной строки. Если они все совпали, то исходная строка является палиндромом, в противном случае – нет. Например,
А роза упала на лапу Азора. // Исходная строка Арозаупаланалапуазора // Очищенная строка арозаупаланалапуазора // Преобразованная строка к нижнему регистру арозаупаланалапуазора // Строка из стека
|