Если вы еще не знаете, что такое очередь, это довольно просто.

Я уверен, что все мы когда-то стояли в очередях, например, в продуктовом магазине или банке. Сначала помогают тому, кто стоит в очереди, затем второму, затем третьему и так далее.

в НАСТОЯЩУЮ очередь

Точно такая же концепция определяет очередь в информатике.

Структура данных очереди всегда ведет себя как настоящая очередь. Элемент, который был вставлен первым, всегда будет первым удаляться из очереди. Обычный термин для этого — «первым пришел — первым вышел» (FIFO).

Вы можете использовать массив в качестве очереди в ruby, если используете определенные методы массива.

Пример:

queue = Array.new
queue.unshift "apple"
queue.unshift "orange"
queue.unshift "banana"

# queue is: ["apple", "orange", "banana"]

queue.last  # peek returns "dog"

queue.pop # "banana"
queue.pop # "orange"

# queue is: ["apple"]
Войти в полноэкранный режим

Выйти из полноэкранного режима

Здесь мы используем Array#unshift чтобы добавить элемент в очередь. Array#pop удаляет первый элемент из очереди и Array#last смотрит на первый элемент.

Есть и другие полезные методы, такие как Array#size а также Array#empty? которые обычно используются разработчиками для очередей.

Если вы любите синтаксический сахар, как и я (Ruby 4 lyfe), вы будете рады узнать, что в Ruby есть встроенный класс Queue.

синтаксический сахар мммм

В отличие от предыдущей реализации массива, класс Ruby Queue является потокобезопасным и обычно используется для координации работы в многопоточных программах.

Это особенно полезно в многопоточном программировании, когда необходимо безопасно обмениваться информацией между несколькими потоками. Ruby’s Queue имеет много методов, которые больше похожи на Array.

Он имеет аналогичные методы для добавления элементов в конец очереди, такие как #push, #enq и #<< (лопата).

Он также имеет методы, аналогичные классу Array, для удаления элементов из очереди, таких как #pop, #deq и #shift.

#Create a new QUEUE q1
queue = Queue.new
 
queue.push(5)
queue.push(6)
 
#Prints the element
             puts queue.pop
                 puts queue.pop
Войти в полноэкранный режим

Выйти из полноэкранного режима

5
6
Войти в полноэкранный режим

Выйти из полноэкранного режима

Вы можете видеть здесь, что методы Queue в основном такие же, как и Array, но за кулисами есть некоторая встроенная магия для работы многопоточности.

Например, в приведенном выше примере повторный вызов pop в пустую очередь приведет к тому, что ваш текущий поток будет спать и ждать, пока что-то не будет добавлено в очередь.


Размерная очередь

SizedQueue в Ruby — это то же самое, что и обычный класс Queue, но с ограничением по размеру, отсюда и название.

Всякий раз, когда очередь заполнена, методы push (и <<) приостанавливают текущий поток до тех пор, пока элемент не будет удален из очереди.

queue = SizedQueue.new(5)
Войти в полноэкранный режим

Выйти из полноэкранного режима

queue.push(:oranges)
queue.push(:apples)
queue.push(:blue)
queue.push(:orange)
queue.push(:green)
# At this point, the SizedQueue is full

queue.push(:throw_expection)
# data_structures/queues/queue.rb:81:in `push': No live threads left. Deadlock? (fatal)
# 1 threads, 1 sleeps current:0x00007ff54f407130 main thread:0x00007ff54f407130
# * #<Thread:0x00007ff54f86ef38 sleep_forever>
#    rb_thread_t:0x00007ff54f407130 native:0x000000010dd24dc0 int:0
#    data_structures/queues/queue.rb:81:in `push'
#    data_structures/queues/queue.rb:81:in `<main>'
#   from data_structures/queues/queue.rb:81:in `<main>'
Войти в полноэкранный режим

Выйти из полноэкранного режима

Одна полезная вещь в очереди размера заключается в том, что вы можете вызвать исключение, передав true в качестве аргумента, например:

queue.push(:throw_expection, true)
# data_structures/queues/queue.rb:83:in `push': queue full (ThreadError)
#   from data_structures/queues/queue.rb:83:in `<main>'
Войти в полноэкранный режим

Выйти из полноэкранного режима

Вот и все! Если хотите, оставьте комментарий, и я добавлю еще несколько реализаций Ruby структуры данных очереди. Я надеюсь, что это помогло моим подглядывающим изучать структуры данных и алгоритмы! УДАЧНОГО КОДИРОВАНИЯ!