Стек

Что нужно сделать

Мы уже говорили, что в программировании нередко необходимо создавать свои собственные структуры данных на основе уже существующих. Одной из таких «базовых» структур является стек.

Стек — это абстрактный тип данных, представляющий собой список элементов, организованных по принципу LIFO (англ. last in — first out, «последним пришёл — первым вышел»).

Простой пример: стек из книг на столе. Единственной книгой, чья обложка видна, является самая верхняя. Чтобы получить доступ к, например, третьей снизу книге, нам нужно убрать все книги, лежащие сверху, одну за другой.

Напишите класс, который реализует стек и его возможности (достаточно будет добавления и удаления элемента).

После этого напишите ещё один класс — «Менеджер задач». В менеджере задач можно выполнить команду «новая задача», в которую передаётся сама задача (str) и её приоритет (int). Сам менеджер работает на основе стека (не наследование!). При выводе менеджера в консоль все задачи должны быть отсортированы по приоритету: чем меньше число, тем выше задача.

Вот пример основной программы:

manager = TaskManager()
manager.new_task("сделать уборку", 4)
manager.new_task("помыть посуду", 4)
manager.new_task("отдохнуть", 1)
manager.new_task("поесть", 2)
manager.new_task("сдать дз", 2)
print(manager)

Результат:
1 отдохнуть
2 поесть; сдать дз
4 сделать уборку; помыть посуду

Дополнительно: реализуйте также удаление задач и подумайте, что делать с дубликатами.

Что оценивается

  • Результат вычислений корректен.
  • Модели реализованы в стиле ООП, основной функционал описан в методах классов и в отдельных функциях.
  • При написании классов соблюдаются основные принципы ООП: инкапсуляция, наследование и полиморфизм.
    • Для получения и установки значений у приватных атрибутов используются сеттеры и геттеры.
    • Для создания нового класса на основе уже существующего используется наследование.
  • Формат вывода соответствует примеру.
  • Переменные, функции и собственные методы классов имеют значащие имена, а не abcd.
  • Классы и методы/функции имеют прописанную документацию.
class TaskManager:
    def __init__(self):
        self.__stack = list()

    def new_task(self, task: str, num: int):
        count_hit = 0
        if len(self.__stack) > 0:
            for i in self.__stack:
                if i[0] == num:
                    i[1] = f'{i[1]}; {task}'
                    count_hit += 1
            if count_hit == 0:
                self.__stack.append([num, task])
        else:
            self.__stack.append([num, task])
        self.__stack = self.__sort_stack(self.__stack)


    def __sort_stack(self, stack: list):
        return sorted(stack, key=lambda task: task[0])

    def del_task(self, num):
        count = 0
        for i in self.__stack:
            if i[0] == num:
                self.__stack.pop(count)
                print(f'Задача {num} удалена.\n')
                break
            count += 1

    def __str__(self):
        print('Список задач:')
        result = ''
        for i in self.__stack:
            result += f'{i[0]} {i[1]}\n'
        return result


manager = TaskManager()
manager.new_task("сделать уборку", 4)
manager.new_task("помыть посуду", 4)
manager.new_task("отдохнуть", 1)
manager.new_task("поесть", 2)
manager.new_task("сдать дз", 2)
print(manager)
manager.del_task(4)
print(manager)