<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kawsar Ahmed Bhuiyan</title>
    <description>The latest articles on DEV Community by Kawsar Ahmed Bhuiyan (@kawsarahmedbhuiyan).</description>
    <link>https://dev.to/kawsarahmedbhuiyan</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3223872%2F6e6e087b-b137-49db-9338-406b14af62c1.png</url>
      <title>DEV Community: Kawsar Ahmed Bhuiyan</title>
      <link>https://dev.to/kawsarahmedbhuiyan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kawsarahmedbhuiyan"/>
    <language>en</language>
    <item>
      <title>Understanding Queue Implementation Using Arrays and Circular Arrays</title>
      <dc:creator>Kawsar Ahmed Bhuiyan</dc:creator>
      <pubDate>Mon, 02 Jun 2025 03:32:23 +0000</pubDate>
      <link>https://dev.to/kawsarahmedbhuiyan/understanding-queue-implementation-using-arrays-and-circular-arrays-32aa</link>
      <guid>https://dev.to/kawsarahmedbhuiyan/understanding-queue-implementation-using-arrays-and-circular-arrays-32aa</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;queue&lt;/strong&gt; is a data structure that works like a line of people — the first to come in is the first to get served. It follows the &lt;strong&gt;FIFO&lt;/strong&gt; principle: First-In, First-Out.&lt;/p&gt;

&lt;p&gt;Implementing queues using arrays is straightforward, but it comes with some challenges. Here we will explain step-by-step why certain techniques are used, especially why circular arrays are helpful. We will also go over the common “full vs empty” confusion and the "n-1 vs n slots" issue by showing two different circular-array based queue implementations.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 1: Queue Using Linear Arrays
&lt;/h2&gt;

&lt;p&gt;Imagine a simple array of size 5:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Index&lt;/th&gt;
&lt;th&gt;0&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;th&gt;3&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Array&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;We can use this array to represent a Queue. We will use two pointers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;front&lt;/code&gt; — indicates the position from which we should remove an element. &lt;em&gt;[Dequeue]&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rear&lt;/code&gt; — indicates the position where we should insert an element. &lt;em&gt;[Enqueue]&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example:
&lt;/h3&gt;

&lt;p&gt;Initial state:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Index&lt;/th&gt;
&lt;th&gt;0&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;th&gt;3&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Array&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;front&lt;/td&gt;
&lt;td&gt;↑&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rear&lt;/td&gt;
&lt;td&gt;↑&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;front = 0&lt;/code&gt;&lt;br&gt;
&lt;code&gt;rear = 0&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Enqueue 40, 20, 10, 30:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Index&lt;/th&gt;
&lt;th&gt;0&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;th&gt;3&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Array&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;front&lt;/td&gt;
&lt;td&gt;↑&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rear&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;↑&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;front = 0&lt;/code&gt;&lt;br&gt;
&lt;code&gt;rear = 4&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;In a queue, we are allowed to &lt;strong&gt;insert (enqueue)&lt;/strong&gt; elements only at the &lt;strong&gt;rear&lt;/strong&gt;. So, each time we enqueue an element, we move the &lt;code&gt;rear&lt;/code&gt; pointer forward to indicate where the next element should be inserted.&lt;br&gt;&lt;br&gt;
As a result, after enqueuing 40, the value of &lt;code&gt;rear&lt;/code&gt; becomes &lt;code&gt;1&lt;/code&gt;; after enqueuing 20, it becomes &lt;code&gt;2&lt;/code&gt;; after enqueuing 10, it becomes &lt;code&gt;3&lt;/code&gt;; and after enqueuing 30, it becomes &lt;code&gt;4&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Dequeue twice so that 40 and 20 gets removed from the queue:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Index&lt;/th&gt;
&lt;th&gt;0&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;th&gt;3&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Array&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;front&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;↑&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rear&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;↑&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;front = 2&lt;/code&gt;&lt;br&gt;
&lt;code&gt;rear = 4&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;In a queue, we are allowed to &lt;strong&gt;remove (dequeue)&lt;/strong&gt; elements only from the &lt;strong&gt;front&lt;/strong&gt;. So, each time we dequeue an element, we move the &lt;code&gt;front&lt;/code&gt; pointer forward to indicate where the next element should be removed from.&lt;br&gt;&lt;br&gt;
As a result, after dequeuing 40, the value of &lt;code&gt;front&lt;/code&gt; becomes &lt;code&gt;1&lt;/code&gt;; and after dequeuing 20, it becomes &lt;code&gt;2&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Now, let's try to enqueue 80 and 60.&lt;/p&gt;

&lt;p&gt;After enqueuing 80:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Index&lt;/th&gt;
&lt;th&gt;0&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;th&gt;3&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Array&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;front&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;↑&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rear&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;front = 2&lt;/code&gt;&lt;br&gt;
&lt;code&gt;rear = 5&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;After enqueing 80, the value of &lt;code&gt;rear&lt;/code&gt; becomes &lt;code&gt;4 + 1 = 5&lt;/code&gt;. So, we can't enqueue any more element as there is no &lt;code&gt;5th&lt;/code&gt; index in a &lt;code&gt;5-sized&lt;/code&gt; array. &lt;br&gt;
Even though space at the beginning is free we can't use it because we can only insert at the index indicated by &lt;code&gt;rear&lt;/code&gt;. This leads to &lt;strong&gt;wasted space&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Part 2: Queue Using Circular Arrays
&lt;/h2&gt;

&lt;p&gt;To avoid wasted space, we can treat the array as &lt;strong&gt;circular&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When &lt;code&gt;rear&lt;/code&gt; or &lt;code&gt;front&lt;/code&gt; reach the end (&lt;code&gt;n-1&lt;/code&gt;), they will wrap around to &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We use the modulo operator &lt;code&gt;%&lt;/code&gt; for this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rear = (rear + 1) % n
front = (front + 1) % n
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Why modulo?
&lt;/h3&gt;

&lt;p&gt;Because array indices must stay between &lt;code&gt;0&lt;/code&gt; and &lt;code&gt;n-1&lt;/code&gt;. Using modulo lets the pointers wrap around naturally.&lt;/p&gt;




&lt;h3&gt;
  
  
  Using the same example:
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Index&lt;/th&gt;
&lt;th&gt;0&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;th&gt;3&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Array&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;front&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;↑&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rear&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;↑&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;front = 2&lt;/code&gt;&lt;br&gt;
&lt;code&gt;rear = 4&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Enqueue 80:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Index&lt;/th&gt;
&lt;th&gt;0&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;th&gt;3&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Array&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;front&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;↑&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rear&lt;/td&gt;
&lt;td&gt;↑&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;front = 2&lt;/code&gt;&lt;br&gt;
&lt;code&gt;rear = 0&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;After enqueing 80, the value of rear becomes &lt;code&gt;(4 + 1) % 5 = 0&lt;/code&gt;. Here, &lt;code&gt;rear&lt;/code&gt; wrapped from &lt;code&gt;4&lt;/code&gt; back to &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So, we can easily enqueue 60 at the &lt;code&gt;0th&lt;/code&gt; index represented by &lt;code&gt;rear&lt;/code&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Index&lt;/th&gt;
&lt;th&gt;0&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;th&gt;3&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Array&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;front&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;↑&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rear&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;↑&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;front = 2&lt;/code&gt;&lt;br&gt;
&lt;code&gt;rear = 1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;After enqueing 60, the value of rear becomes &lt;code&gt;(0 + 1) % 5 = 1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We can even enqueue one more element, let's say 70:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Index&lt;/th&gt;
&lt;th&gt;0&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;th&gt;3&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Array&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;front&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;↑&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rear&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;↑&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;front = 2&lt;/code&gt;&lt;br&gt;
&lt;code&gt;rear = 2&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;After enqueing 70, the value of rear becomes &lt;code&gt;(1 + 1) % 5 = 2&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Now, the queue is &lt;strong&gt;full&lt;/strong&gt;. So, we can not enqueue any more element without dequeing at least one element.&lt;/p&gt;

&lt;p&gt;Therefore, we can say that if &lt;code&gt;front == rear&lt;/code&gt;, it indicates the queue is &lt;strong&gt;full&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But there is a problem. Recall that when the queue was empty, both &lt;code&gt;front&lt;/code&gt; and &lt;code&gt;rear&lt;/code&gt; had the value of 0. &lt;br&gt;
So, even when the queue was emtpy &lt;code&gt;front == rear&lt;/code&gt; was true. This leads to the ambiguity. We can not use &lt;code&gt;front == rear&lt;/code&gt; condition to indicate both an empty queue and a full queue.&lt;/p&gt;

&lt;h3&gt;
  
  
  So, what is the solution?
&lt;/h3&gt;

&lt;p&gt;We can assume that the queue (circular array) is full when there is one empty slot left in the queue:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Index&lt;/th&gt;
&lt;th&gt;0&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;th&gt;3&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Array&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;front&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;↑&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rear&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;↑&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;front = 2&lt;/code&gt;&lt;br&gt;
&lt;code&gt;rear = 1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;In other words, we use the following test to check if the queue is full:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;( rear + 1 ) % n == front&lt;/code&gt;          &lt;/p&gt;

&lt;p&gt;So, in this case, as &lt;code&gt;(rear + 1 ) % n = (1 + 1) % 5 = 2&lt;/code&gt; and &lt;code&gt;front = 2&lt;/code&gt;, we will consider this queue to be &lt;strong&gt;full&lt;/strong&gt; and will not try to enqueue any more element as long as we do not dequeue at least one element. &lt;/p&gt;

&lt;p&gt;We &lt;strong&gt;got rid of the ambiguity&lt;/strong&gt; but in doing so, we had to &lt;strong&gt;waste one slot&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 3: Why Keep One Slot Empty?
&lt;/h2&gt;

&lt;p&gt;If we want to &lt;strong&gt;use all &lt;code&gt;n&lt;/code&gt; slots&lt;/strong&gt;, we can track the number of elements of the queue with a &lt;code&gt;size&lt;/code&gt; variable. &lt;br&gt;
Each time we enqueue an element, apart from moving the &lt;code&gt;rear&lt;/code&gt; pointer forward, we will also increase the value of &lt;code&gt;size&lt;/code&gt; by 1 and each time we dequeue an element, apart from moving the &lt;code&gt;front&lt;/code&gt; pointer forward, we will also decrease the value of &lt;code&gt;size&lt;/code&gt; by 1.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;[We will still use &lt;code&gt;rear = (rear + 1) % n&lt;/code&gt; and &lt;code&gt;front = (front + 1) % n&lt;/code&gt; to increment &lt;code&gt;rear&lt;/code&gt; and &lt;code&gt;front&lt;/code&gt;.]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To check if the queue is &lt;strong&gt;empty&lt;/strong&gt; we will check if  &lt;code&gt;size == 0&lt;/code&gt; and to check if the queue is &lt;strong&gt;full&lt;/strong&gt;, we will check if &lt;code&gt;size == n&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Using this implementation, we can use &lt;strong&gt;all &lt;code&gt;n&lt;/code&gt; slots&lt;/strong&gt; of the array.&lt;/p&gt;

&lt;p&gt;Using the same example that we have discussed so far:&lt;/p&gt;

&lt;p&gt;Initial state:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Index&lt;/th&gt;
&lt;th&gt;0&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;th&gt;3&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Array&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;front&lt;/td&gt;
&lt;td&gt;↑&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rear&lt;/td&gt;
&lt;td&gt;↑&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;front = 0&lt;/code&gt;&lt;br&gt;
&lt;code&gt;rear = 0&lt;/code&gt;&lt;br&gt;
&lt;code&gt;size = 0&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then if we &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Enqueue 40, 20, 10, 30.&lt;/li&gt;
&lt;li&gt;Dequeue twice so that 40 and 20 gets removed from the queue.&lt;/li&gt;
&lt;li&gt;Enqueue 80 and 60.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;the value of &lt;code&gt;size&lt;/code&gt; will change from &lt;code&gt;0&lt;/code&gt; to &lt;code&gt;4&lt;/code&gt; to &lt;code&gt;2&lt;/code&gt; to &lt;code&gt;4&lt;/code&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Index&lt;/th&gt;
&lt;th&gt;0&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;th&gt;3&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Array&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;front&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;↑&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rear&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;↑&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;front = 2&lt;/code&gt;&lt;br&gt;
&lt;code&gt;rear = 1&lt;/code&gt;&lt;br&gt;
&lt;code&gt;size = 4&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And as &lt;code&gt;size != n&lt;/code&gt;, we will still be able to enqueue 70 to the &lt;code&gt;1st&lt;/code&gt; index:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Index&lt;/th&gt;
&lt;th&gt;0&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;th&gt;3&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Array&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;front&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;↑&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rear&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;↑&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;front = 2&lt;/code&gt;&lt;br&gt;
&lt;code&gt;rear = 2&lt;/code&gt;&lt;br&gt;
&lt;code&gt;size = 5&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And finally, at this point, as &lt;code&gt;size == n&lt;/code&gt;, we will consider this queue to be &lt;strong&gt;full&lt;/strong&gt; and will not try to enqueue any more element as long as we do not dequeue at least one element. &lt;/p&gt;

&lt;p&gt;So, in this implementation, using only an extra variable we can use all &lt;strong&gt;all&lt;/strong&gt; &lt;code&gt;n&lt;/code&gt; &lt;strong&gt;slots&lt;/strong&gt; of the array.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary of Difference Between the Two Circular Array Based Queue Implementations
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;First Implementation (One Slot Empty)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Second Implementation (Tracking Size To Use Full Capacity)&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Max Elements&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;n - 1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;n&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Full Condition&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;(rear + 1) % n == front&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;size == n&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Empty Condition&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;front == rear&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;size == 0&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Operations After Enqueue&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;rear = (rear + 1) % n&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;rear = (rear + 1) % n&lt;/code&gt; and &lt;code&gt;size = size + 1&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Operations After Dequeue&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;front = (front + 1) % n&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;front = (front + 1) % n&lt;/code&gt; and &lt;code&gt;size = size - 1&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




</description>
    </item>
  </channel>
</rss>
