Перед выполнением задания внимательно прочитайте:
- О всех этапах проверки задания
- О том, как отправить пулл
- О том, как пройти тесты
- Правила оформления javascript, HTML и CSS кода
Мы очень хотим, чтобы код вы написали сами, а не пользовались внешними библиотеками.
У Аркадия есть хобби – он обожает писать библиотеки, чтобы позже их переиспользовать. Ведь это так увлекательно! У Аркадия уже есть опыт написания библиотек, однако у него ну никак не получается достичь такой же популярности, какой достигли такие легенды как is-thirteen, thanosjs и, конечно же, left-pad.
Аркадий подумал и решил, что он напишет самую лучшую и полезную библиотеку, с важными для разработки интерфейсов вещами – со структурами данных.
А чтобы точно гарантировать популярность своей библиотеки, он будет писать её на хайповом TypeScript. К сожалению, Аркадий мало знаком с этим языком, поэтому он обратился к вам, как к специалисту по разборкам с типами.
⚠️ Использовать массивы не разрешается
Связный список. Поддерживает операции вставки и извлечения первого и последнего элемента.
constructor()
– инициализирует пустой связный списокpush(element)
– вставляет элемент в конец спискаpop()
– извлекает последний элемент списка и возвращает его, либоundefined
, если список пустunshift(element)
– вставляет элемент в начало спискаshift()
– извлекает первый элемент списка и возвращает его, либоundefined
, если список пустsize
– количество элементов в списке
⚠️ Использовать массивы не разрешается
Кольцевой буфер. Поддерживает операции вставки в конец и извлечения из начала. Если продолжить запись в буфер, не принимая во внимание его вместимость, то новые данные начнут выталкивать старые данные.
constructor(capacity)
– инициализирует буфер вместимостиcapacity
get(index)
– возвращает элемент коллекции расположенный по указанному индексу, либоundefined
, если индекс находится вне границ буфераpush(element)
– вставляет элемент в конец коллекцииshift()
– извлекает первый элемент из коллекции и возвращает его, либоundefined
, если буфер пустstatic concat(buffer1, buffer2, ...)
– возвращает новый буфер состоящий из элементовbuffer1
,buffer2
, ... с общей вместимостью равной сумме вместимостей переданных буферовcapacity
– вместимость буфераsize
– количество элементов в буфере
⚠️ Использовать массивы не разрешается
Очередь. Список элементов, организованных по принципу "первым пришёл – первым вышел". Элементы добавляются и извлекаются с одного конца списка.
constructor()
– инициализирует пустую очередьget(index)
– возвращает элемент очереди расположенный по указанному индексу, либоundefined
, если индекс находится вне границ буфераenqueue(element)
– добавляет элемент в очередьdequeue()
– извлекает элемент из очереди, либо возвращаетundefined
, если очередь пустаsize
– количество элементов в очереди
⚠️ Использовать массивы не разрешается
Очередь с приоритетом. Отличается от обычной очереди наличием приоритета у элементов.
Приоритет может быть одним из трех значений:
1
– низкий2
– средний3
– высокий
Магические числа в коде – плохо, поэтому рекомендуем использовать Enum
constructor()
– инициализирует пустую очередь с приоритетомenqueue(element, priority)
– добавляет элемент с приоритетом в очередьdequeue()
– извлекает элемент с наивысшим приоритетом из очереди. Если есть несколько элементов с одинаковым приоритетом, извлекается элемент, который был помещён в очередь первым (из элементов с наивысшим приоритетом). Либо возвращаетundefined
, если очередь пустаsize
– количество элементов в очереди
Хеш таблица. Отличается от стандартного объекта тем, что в качестве ключей можно использовать объекты, а не только строки.
Использовать
Map
не разрешается.
constructor()
– инициализирует пустую хеш таблицуget(key)
– возвращает элемент таблицы по указанному ключу, либоundefined
, если элемент по переданному ключу не существуетput(key, element)
– добавляет элемент в словарь по указанному ключуclear()
– очищает таблицуsize
– количество элементов в таблице
При проверке задания мы не будем обращать большое внимание на внутреннюю организацию структур данных. Главное, чтобы они реализовывали заданный интерфейс и предоставляли только перечисленные свойства и методы. Также, поскольку вы реализуете строго типизированные структуры данных, то описанные вами типы должны запрещать добавление элементов разных типов.
В файле std.spec.ts вы можете найти примеры использования вашего кода.
Теперь LinkedList
хранит указатель, который по-умолчанию указывает на первый элемент.
Появляется два дополнительных метода:
prev()
– возвращает текущий элемент списка, на который указывает указатель, либоundefined
, если список пуст. Устанавливает указатель на предыдущий элемент, если такой естьnext()
– возвращает текущий элемент списка, на который указывает указатель, либоundefined
, если список пуст. Устанавливает указатель на следующий элемент, если такой есть
При этом расширяют свое поведение:
pop()
– если указатель указывает на последний элемент, то выполняетprev()
shift()
– если указатель указывает на первый элемент, то выполняетnext()