# StackApp
Решение состоит из 2-х проектов:
* StackApp.GUI (каталог StackApp)
* StackApp.StackModel
Целевая платформа: .Net Framework 4.7.2
## StackApp.StackModel
Данный проект - это библиотека классов.
Здесь содержатся классы:
* Node
* Operations
* Stack
* NotInitializedException
* AlreadyInitializedException
* EmptyStackException
Классы Node, Stack и методы класса Operations - шаблонные, поэтому при использовании стека мы можем выбирать, какой тип данных он будет хранить.
### Node
Данный класс представляет из себя ячейку стека. Имеет 2 поля
* Value - значение, хранимое в ячейке
* Next - следующая ячейка
### Stack
Данный класс хранит всю информацию о стеке, а так же его верхний элемент. Имеет 3 поля:
* Head - верхний элемент
* Count - количество элементов
* Initialized - был ли стек инициализирован
Также имеет переопределение метода ToString.
### Operations
Статичный класс, методы которого реализуют все операции над стеком. Каждый метод является шаблонным, а также методом расширения. Т.е. вызов этих методов можно производить двумя способами:
* stack.Push(value);
* Operations.Push(stack, value);
### NotInitializedException
Пользовательский класс исключения, который должен выбрасываться, когда производится попытка совершить операцию с неинициализированным стеком.
### AlreadyInitializedException
Пользовательский класс исключения, который должен выбрасываться, когда производится попытка совершить инициализацию уже инициализированного стека.
### EmptyStackException
Пользовательский класс исключения, который должен выбрасываться, когда производится попытка совершить операцию удаления или получения верхнего элемента с пустым стеком.
## StackApp.GUI
GUI для взаимодействия со стеком. Сам объект стека хранится в классе Program, как публичное статическое поле.
MainForm - это класс главного окна программы. Все операции, кроме добавления нового элемента, происходит в нём.
AddForm - это класс окна добавления нового элемента. Когда оно открывается, главное окно становится недоступным, пока окно AddForm не закроется.
Вывод всех результатов производится через MessageBox.