This put up incorporates some information from the ChatGPT.
You may assume, “Queues aren’t used a lot in Ruby,” and it is true, you do not usually see a queue implementation in Ruby or Rails initiatives. However for me, the time has handed once I cared about whether or not I will use one thing in my profession or not. I simply need to have the data, and I counsel you studying this put up to do the identical, you may by no means know when you are going to want it and I imagine these items are what make an enormous distinction in our profession.
The Queue is a linear and dynamic knowledge construction, following the FIFO (First In, First Out) precept. This implies the primary ingredient to enter is the primary to go away. Consider a line of individuals at a financial institution: the primary one in line will get served first.
Ordered insertion and elimination: Components are added on the finish of the queue and faraway from the start.
Enqueue: Add a component on the finish of the queue, replace the tail reference, and replace the merchandise rely.
Dequeue: Take away the ingredient from the start of the queue, replace the pinnacle reference, and replace the merchandise rely.
Peek/Entrance: Try the primary ingredient of the queue with out eradicating it.
Ideally suited for conditions requiring processing within the order of arrival, resembling useful resource administration in computing or customer support.
Implementation: Might be carried out with arrays or linked lists. The simplicity and effectivity of the Queue make it a well-liked alternative in numerous software program functions.
Queues, like Linked Lists, require a container to carry the information inside the construction, on this case, Nodes.
A traditional instance of utilizing queues in software program growth is managing asynchronous duties or messages. That is particularly widespread in distributed programs and internet functions, the place operations may be deferred and executed exterior the primary stream to keep away from blocking processing.
For instance, in an e-commerce software, when a consumer locations an order, the order affirmation and cost processing is perhaps added to a queue. In the meantime, the consumer will get a direct response that their order has been acquired. Within the background, providers processing funds and updating stock eat these duties from the queue, processing them sequentially.
This permits the applying to deal with demand spikes extra effectively, spreading the workload over time, and guaranteeing that crucial operations are accomplished reliably and so as.
This implementation will not be centered on efficiency, however on being simple to grasp.
# One of many smallest knowledge constructions we are able to have, # a easy Node performing like a container to wrap our knowledge. class Node attr_accessor :worth, :next_value def initialize(worth) @worth = worth # Wrapped knowledge @next_value = nil # Reference to subsequent begins nil finish finish # The Queue implementation class Queue attr_accessor :size, :head, :tail def initialize @size = 0 @head = nil @tail = nil finish def enqueue(worth) node = Node.new(worth) # Create a brand new node @size += 1 # Replace the Queue size if @head.nil? # Test if head is nil @head = @tail = node # Set the brand new node as head and tail return # ends the enqueue finish @tail.next_value = node # Holding the references @tail = node # Tail receives the brand new node finish def dequeue return nil if head.nil? # Nothing to dequeue @size -= 1 # Replace size to -1 head = @head # Save present head in a variable @head = head.next_value # Replace head to the second merchandise # head.next_value = nil # Breaks hyperlink between the outdated head # required in non GC languages head.worth # Return the eliminated worth finish def peek return nil if head.nil? # Checking once more if head is nil head.worth # Returns the pinnacle worth finish finish # At all times a good suggestion having some automated exams :) require 'rspec/autorun' describe '#enqueue / #dequeue / #peek' do it 'has the Jose worth' do q = Queue.new q.enqueue('Jose') anticipate(q.peek).to eq('Jose') anticipate(q.size).to eq(1) q.enqueue('Mary') anticipate(q.peek).to eq('Jose') anticipate(q.size).to eq(2) q.dequeue anticipate(q.peek).to eq('Mary') anticipate(q.size).to eq(1) finish finish
Hope you prefer it.