Конечно, для любого производственного кода вы должны полагаться на надежную реализацию библиотеки, которая уже выдержала испытание временем.
Тем не менее, для самообучения может быть весело написать его самостоятельно.Я делал это раньше.
Самый эффективный из известных мне способов заключается в том, чтобы использовать подход, аналогичный тому, что делает большинство коллекций с изменяемым размером внутри: хранить массив, размер которого увеличивается (обычно удваивается) по мере необходимостиразмер коллекции достигает длины массива.
Очередь немного отличается от обычной коллекции, потому что вы хотите иметь возможность выскакивать с противоположного конца от того места, куда выталкиваются элементы.
Очевидно, что убрать первый элемент и сдвинуть все остальные элементы на один индекс будет дорого и бессмысленно.Поэтому вместо этого вы сами отслеживаете начальные и конечные индексы.Когда коллекция достигает конца массива, вы используете %
, чтобы начать выталкивать элементы обратно в начало.
Ключ просто обрабатывает вашу математику, чтобы вы обрабатывали все случаи, например, правильно увеличивали массивкогда очередь заполнена, правильные проверки границ, увеличение начального индекса (или возврат к нулю) для каждого всплывающего окна и т. д.
Очевидно, что описанный выше дизайн имеет много ограничений: безопасность потоков, например.Но для простой, однопоточной, эффективной реализации это довольно хорошая отправная точка.
Удачи - и я также рекомендую опубликовать ваш код, если / когда у вас есть тот, который, по вашему мнению, работает!