Learn Ruby Queue with Examples07 Jan 2020
In Ruby Language, if we want to use a FIFO(First In First Out) Queue data structure, we can use
Array as a
Queue. If you want to use a queue object in a
multi-threads program, then you can choose to use ruby
Let’s learn to use them with some examples:
Use Array as a Queue
Ruby Array provides us plenty of useful methods.
If we see the last index as the head of the
Queue, we can use
#unshift to enqueue,
#pop to dequeue, and to peek the head element, with this approach we can use
queue = Array.new # or  queue.unshift "dog" queue.unshift "cat" queue.unshift "cow" # queue is: ["cow", "cat", "dog"] queue.last # peek returns "dog" queue.pop # "dog" queue.pop # "cat" # queue is: ["cow"]
We could see the index 0 as the head of the queue. Then we will use
#push as enqueue method,
#shift as dequeue method, and
#first as the peek method.
queue = Array.new # or  queue.push "dog" # or << queue.push "cat" queue.push "cow" # queue is: ["dog", "cat", "cow"] queue.first # peek returns "dog" queue.shift # "dog" queue.shift # "cat" # queue is: ["cow"]
There are another two methods
#empty? used a lot for a queue.
For example when we want to loop through the queue
while !queue.empty? do # or queue.size > 0 item = queue.pop # do thing with item end
Ruby Queue Class
Ruby Queue class is a
blocking queue implementation. And we can use it in a
We can use
#<< methods to enqueue.
#shift methods to dequeue.
Those methods are more intuitive than methods in
The blocking feature is decided by
non_block argument in
#pop method, the default value for
non_block is false, so when the queue is empty, the calling thread is suspended until data is pushed onto the queue.
non_block is true, like
queue.pop(true), the thread isn’t suspended, and
ThreadError is raised.
I will create another post to demonstrate how to use
Queue in a coding interview problem.
Ruby SizedQueue Class
SizedQueue is another Queue implementation in which you can specify the size capacity for the queue. If the capacity is full then the
push operation will be blocked.
sized_queue = SizedQueue.new(3) # the maximum size is 5 sized_queue.push("a") sized_queue.push("b") sized_queue.push("c") sized_queue.push("d") # This one is blocked.
#push method can accept another argument
non_block, the default value is
non_block is true, the thread isn’t suspended, and
ThreadError is raised.
There is one disadvantage of using
SizedQueue classes, they both don’t have the
#peek method to let you peek the head element of the queue.
I will show you how to implement a
Array in another Ruby Rate Limiter post.