Очереди

Очередь или односторонняя очередь — это линейный список, в котором все операции вставки выполняются на одном из концов списка, а все операции удаления (и, как правило, операции доступа к данным) — на другом.

По отношению к очередям применяют понятия начало (front) и конец (rear) очереди.

Структура такого типа определяет набор правил:

Временная сложность вставки и удаления элемента в очередь составляет O(1).

В Scala присутствует стандартная релизация очереди, описанная в соответствующем разделе.

Оценка:

Код:

final class Queue[+A](in: List[A], out: List[A]):
  def frontOption: Option[A] = dequeue.map(_._1)

  def rearOption: Option[Queue[A]] = dequeue.map(_._2)

  lazy val isEmpty: Boolean = in.isEmpty && out.isEmpty

  def enqueue[B >: A](x: B): Queue[B] = Queue(x :: in, out)

  def dequeue: Option[(A, Queue[A])] = out match
    case hd :: tl => Some((hd, Queue(in, tl)))
    case Nil => in.reverse match
        case hd :: tl => Some((hd, Queue(Nil, tl)))
        case Nil      => None

object Queue:
  def empty[A]: Queue[A] = Queue(Nil, Nil)

Пример:

val emptyQueue: Queue[Int]    = Queue.empty[Int]
val nonEmptyQueue: Queue[Int] = emptyQueue.enqueue(1).enqueue(2)

emptyQueue.frontOption    // None
nonEmptyQueue.frontOption // Some(1)

emptyQueue.rearOption     // None
nonEmptyQueue.rearOption  // Some(Queue(2))
 
emptyQueue.isEmpty)       // true
nonEmptyQueue.isEmpty)    // false

emptyQueue.enqueue(5))    // Queue(5)
nonEmptyQueue.enqueue(5)) // Queue(1,2,5)

emptyQueue.dequeue)       // None
nonEmptyQueue.dequeue)    // Some((1,Queue(2)))

Ссылки: