Изменения

Перейти к: навигация, поиск

Очередь Майкла и Скотта

297 байт добавлено, 17:27, 1 октября 2018
Структура очереди
'''case class''' Node<T>('''val''' data: T, '''val''' next: AtomicReference<Node<T>>)
Если узел <tex>node</tex> является последним в списке, то его <tex>netnext</tex> указывает на <tex>null</tex>.
Сама очередь состоит из двух указателей: на голову <tex>H</tex> и на хвост <tex>T</tex>, которые можно менять атомарно. Удаление из очереди происходит со стороны головы, добавление - со стороны хвоста.
Узел списка, на который указывает <tex>H</tex>, является фиктивным (''dummy''). Данные, хранимые в этом узле, не имеют значения. Изначально очередь состоит из одного ''dummy''-элемента, на который указывают <tex>T</tex> и <tex>H</tex>.
'''class''' Queue<T>: dummy = new Node(null, new AtomicReference<Node>(null)) head = new AtomicReference<Node>(dummy) tail = new AtomicReference<Node>(dummy) // TODO; картинка Будем поддерживать следующий инвариант: в нашей очереди <tex>H</tex> указывает на узел, находящийся не правее узла, на который указывает <tex>T</tex>
==Примечания==
Анонимный участник

Навигация