Clojure может действительно выиграть от литерала очереди.Это было бы чище (и более переносимо), чем полагаться на взаимодействие Java.
Тем не менее, не так уж сложно сложить собственную переносимую постоянную очередь, просто используя обычные бытовые элементы, такие как списки.
Рассмотримочередь в виде двух списков, один из которых обеспечивает головную часть очереди, а другой - хвост.enqueue
добавляет в первый список, dequeue
появляется из последнего.Большинство ISeq
функций реализуются тривиально.
Вероятно, единственная сложная часть - это то, что происходит, когда хвост пуст, и вы хотите dequeue
.В этом случае список заголовков равен reverse
d и становится новым хвостом, а пустой список становится новым списком заголовков.Я считаю, что даже с учетом издержек reverse
, enqueue
и dequeue
остаются O(1)
, хотя k
будет, конечно, выше, чем ванильный вектор.
Happyqueue
ING!