Репозиторий содержит решения этой и этой задачи с ulearn.me. Задачи прошли код-ревью у преподавателя, за обе 50 баллов из 50. Все решения курса на максимальный балл также выложены в других репозиториях. Ветка unsolved содержит изначальный проект.
Конечное приложение - окно с возможностью добавлять/удалять записи и отменять добавление/удаление (сохраняется история).
В этой задаче вам нужно реализовать стек ограниченного размера. Этот стек работает как обычный стек, однако при превышении максимального размера удаляет самый глубокий элемент в стеке. Таким образом в стеке всегда будет ограниченное число элементов.
Вот пример работы такого стека с ограничением в 2 элемента:
// сначала стек пуст
stack.Push(10); // в стеке 10
stack.Push(20); // в стеке 10, 20
stack.Push(30); // в стеке 20, 30
stack.Push(40); // в стеке 30, 40
stack.Pop(); // возвращает 40, в стеке остаётся 30
stack.Pop(); // возвращает 30, стек после этого пуст
Операция Push должна иметь сложность O(1), то есть никак не зависеть от размера стека.
Реализуйте класс LimitedSizeStack
.
Отладьте его реализацию с помощью тестов в классе LimitedSizeStack_should
. Проверьте эффективность операции Push с помощью теста из класса LimitedSizeStack_PerformanceTest
.
Если вы запустите проект на исполнение, то увидите окно приложения, в котором можно добавлять новые дела и удалять уже существующие. Однако кнопка "Отмена" пока не работает. Ваша задача — сделать так, чтобы эта кнопка отменяла последнее действие пользователя.
Изучите класс ListModel
— в нём реализована логика работы кнопок в приложении.
Реализуйте методы Undo
и CanUndo
. Для этого нужно хранить историю последних limit
действий удаления/добавления. Используйте для этого класс LimitedSizeStack
из прошлой задачи.
- Метод
Undo
отменяет последнее действие из истории. - Метод
CanUndo
возвращаетtrue
, если на данный момент история действий не пуста, то есть если вызовUndo
будет корректным. Иначе метод должен вернутьfalse
.
Проверить корректность своего решения можно на модульных тестах из класса ListModel_Should
и ListModel_PerformanceTest
.
Если хотите, можете воспользоваться классическим объектно-ориентированным шаблоном Команда. Однако для сдачи данной задачи, точно следовать этому шаблону необязательно.