{"id":86,"date":"2026-02-12T07:30:00","date_gmt":"2026-02-12T07:30:00","guid":{"rendered":"https:\/\/mattbick.dev\/?p=86"},"modified":"2026-02-10T19:44:37","modified_gmt":"2026-02-10T19:44:37","slug":"data-structure-every-day-day-5-queue-and-deque","status":"publish","type":"post","link":"https:\/\/mattbick.dev\/?p=86","title":{"rendered":"Data Structure Every Day, Day 5: Queue and Deque"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">In my <a href=\"https:\/\/mattbick.dev\/?p=83\" data-type=\"link\" data-id=\"https:\/\/mattbick.dev\/?p=83\">last post<\/a>, I showed how a simple Stack data structure could be implemented by simply reusing our already existing tailless linked list code. In today&#8217;s entry, we are are going to knock out TWO data structures following the same approach. The <strong>queue <\/strong>and the <strong>deque<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Little Refresher:<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For those unfamiliar, here is a general look at how these data structures compare to each other:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Stack:<\/strong><\/p>\n\n\n\n<pre data-line=\"\" class=\"wp-block-prismatic-blocks\"><code class=\"language-\">One end only \u2192 LIFO<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Queue:<\/strong><\/p>\n\n\n\n<pre data-line=\"\" class=\"wp-block-prismatic-blocks\"><code class=\"language-\">Insert at tail\nRemove at head \u2192 FIFO<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Deque<\/strong>:<\/p>\n\n\n\n<pre data-line=\"\" class=\"wp-block-prismatic-blocks\"><code class=\"language-\">Insert\/remove at both ends<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">What Is a Queue?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A queue follows a simple rule:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>First In, First Out (FIFO)<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre data-line=\"\" class=\"wp-block-prismatic-blocks\"><code class=\"language-\">enqueue A\nenqueue B\nenqueue C\n\ndequeue \u2192 A\ndequeue \u2192 B\ndequeue \u2192 C<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Queue API<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Typical queue operations:<\/p>\n\n\n\n<pre data-line=\"\" class=\"wp-block-prismatic-blocks\"><code class=\"language-\">enqueue()\ndequeue()\nfront()\nis_empty()<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">What Is a Deque?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Deque = <strong>Double Ended Queue<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can:<\/p>\n\n\n\n<pre data-line=\"\" class=\"wp-block-prismatic-blocks\"><code class=\"language-\">push_front()\npush_back()\npop_front()\npop_back()<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Why Our Previous Linked Lists Are Perfect For These<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Let\u2019s think in terms of requirements.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Queue Needs<\/h2>\n\n\n\n<pre data-line=\"\" class=\"wp-block-prismatic-blocks\"><code class=\"language-\">Add at tail \u2192 O(1)\nRemove at head \u2192 O(1)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">That means we need:<\/p>\n\n\n\n<pre data-line=\"\" class=\"wp-block-prismatic-blocks\"><code class=\"language-\">head pointer\ntail pointer<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ring a bell? That is our tailed link list implementation, which can be found <a href=\"https:\/\/mattbick.dev\/?p=70\" data-type=\"post\" data-id=\"70\">here<\/a>. <\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Deque Needs<\/h2>\n\n\n\n<pre data-line=\"\" class=\"wp-block-prismatic-blocks\"><code class=\"language-\">Remove at tail \u2192 O(1)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">To do that efficiently, we need:<\/p>\n\n\n\n<pre data-line=\"\" class=\"wp-block-prismatic-blocks\"><code class=\"language-\">prev pointer<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Our previous doubly linked list implementation fulfills this need! That can be found <a href=\"https:\/\/mattbick.dev\/?p=75\" data-type=\"post\" data-id=\"75\">here<\/a>. <\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Implementation Strategy<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Just like with our stack implementation, we are simply writing wrappers that use our pre-existing tailed linked list and doubly linked list code:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>queue.h<\/strong><\/p>\n\n\n\n<pre data-line=\"\" class=\"wp-block-prismatic-blocks\"><code class=\"language-c\">#ifndef QUEUE_H\n#define QUEUE_H\n\n#include &quot;linked_list.h&quot;\n#include &lt;stddef.h&gt;\n\nstruct Queue {\n        struct LinkedList list; \n        size_t size;            \n};\n\n\nvoid queue_init(struct Queue* q);\nvoid queue_destroy(struct Queue* q); \n\n\nint queue_enqueue(struct Queue* q, struct Node* n); \nint queue_dequeue(struct Queue* q);                 \nstruct Node* queue_peek(const struct Queue* q);     \n\nint queue_is_empty(const struct Queue* q);\nsize_t queue_size(const struct Queue* q);\n\n#endif<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>queue.c<\/strong><\/p>\n\n\n\n<pre data-line=\"\" class=\"wp-block-prismatic-blocks\"><code class=\"language-c\">#include &quot;queue.h&quot;\n\nvoid queue_init(struct Queue* q) {\n        if (!q) return;\n        list_init(&amp;q-&gt;list);\n        q-&gt;size = 0;\n}\n\nvoid queue_destroy(struct Queue* q) {\n        if (!q) return;\n        free_list(&amp;q-&gt;list); \/* frees nodes, leaves list usable *\/\n        q-&gt;size = 0;\n}\n\n\/*\n * enqueue = push_back\n *\/\nint queue_enqueue(struct Queue* q, struct Node* n) {\n        if (!q || !n) return -1;\n        push_back(&amp;q-&gt;list, n);\n        q-&gt;size++;\n        return 0;\n}\n\n\/*\n * dequeue = pop_front\n *\/\nint queue_dequeue(struct Queue* q) {\n        if (!q) return -1;\n        if (q-&gt;list.head == NULL) return -1;\n\n        pop_front(&amp;q-&gt;list);\n        q-&gt;size--;\n        return 0;\n}\n\nstruct Node* queue_peek(const struct Queue* q) {\n        if (!q) return NULL;\n        \/* front() takes non-const in your header, so cast is easiest *\/\n        return front((struct LinkedList*) &amp;q-&gt;list);\n}\n\nint queue_is_empty(const struct Queue* q) {\n        return (!q || q-&gt;list.head == NULL);\n}\n\nsize_t queue_size(const struct Queue* q) {\n        return q ? q-&gt;size : 0;\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>deque.h<\/strong><\/p>\n\n\n\n<pre data-line=\"\" class=\"wp-block-prismatic-blocks\"><code class=\"language-c\">#ifndef DEQUE_H\n#define DEQUE_H\n\n#include &lt;stddef.h&gt;\n#include &quot;linked_list.h&quot;\n\nstruct Deque {\n        struct LinkedList list; \n        size_t size;            \n};\n\n\nvoid deque_init(struct Deque* d);\nvoid deque_destroy(struct Deque* d); \n\nint deque_push_front(struct Deque* d, struct Node* n); \nint deque_push_back(struct Deque* d, struct Node* n); \n\nint deque_pop_front(struct Deque* d); \nint deque_pop_back(struct Deque* d);  \n\nstruct Node* deque_peek_front(const struct Deque* d);\nstruct Node* deque_peek_back(const struct Deque* d);\n\nint deque_is_empty(const struct Deque* d);\nsize_t deque_size(const struct Deque* d);\n\n#endif<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>deque.c<\/strong><\/p>\n\n\n\n<pre data-line=\"\" class=\"wp-block-prismatic-blocks\"><code class=\"language-c\">#include &quot;deque.h&quot;\n\nvoid deque_init(struct Deque* d) {\n        if (!d) return;\n        list_init(&amp;d-&gt;list);\n        d-&gt;size = 0;\n}\n\nvoid deque_destroy(struct Deque* d) {\n        if (!d) return;\n        free_list(&amp;d-&gt;list); \n        d-&gt;size = 0;\n}\n\nint deque_push_front(struct Deque* d, struct Node* n) {\n        if (!d || !n) return -1;\n        push_front(&amp;d-&gt;list, n);\n        d-&gt;size++;\n        return 0;\n}\n\nint deque_push_back(struct Deque* d, struct Node* n) {\n        if (!d || !n) return -1;\n        push_back(&amp;d-&gt;list, n);\n        d-&gt;size++;\n        return 0;\n}\n\nint deque_pop_front(struct Deque* d) {\n        if (!d) return -1;\n        if (d-&gt;list.head == NULL) return -1;\n\n        pop_front(&amp;d-&gt;list);\n        d-&gt;size--;\n        return 0;\n}\n\nint deque_pop_back(struct Deque* d) {\n        if (!d) return -1;\n        if (d-&gt;list.tail == NULL) return -1;\n\n        pop_back(&amp;d-&gt;list);\n        d-&gt;size--;\n        return 0;\n}\n\nstruct Node* deque_peek_front(const struct Deque* d) {\n        if (!d) return NULL;\n        return front((struct LinkedList*) &amp;d-&gt;list);\n}\n\nstruct Node* deque_peek_back(const struct Deque* d) {\n        if (!d) return NULL;\n        return back((struct LinkedList*) &amp;d-&gt;list);\n}\n\nint deque_is_empty(const struct Deque* d) {\n        return (!d || d-&gt;list.head == NULL);\n}\n\nsize_t deque_size(const struct Deque* d) {\n        return d ? d-&gt;size : 0;\n}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">The Big Takeaway<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A stack, queue, and deque are not fundamentally different storage systems when compared to their corresponding linked list implementations. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For my next post, I promise I will NOT be hitting you with another rehash of old code \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In my last post, I showed how a simple Stack data structure could be implemented by simply reusing our already existing tailless linked list code. In today&#8217;s entry, we are are going to knock out TWO data structures following the same approach. The queue and the deque. Little Refresher: For those unfamiliar, here is a [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-86","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/mattbick.dev\/index.php?rest_route=\/wp\/v2\/posts\/86","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mattbick.dev\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mattbick.dev\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mattbick.dev\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mattbick.dev\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=86"}],"version-history":[{"count":2,"href":"https:\/\/mattbick.dev\/index.php?rest_route=\/wp\/v2\/posts\/86\/revisions"}],"predecessor-version":[{"id":88,"href":"https:\/\/mattbick.dev\/index.php?rest_route=\/wp\/v2\/posts\/86\/revisions\/88"}],"wp:attachment":[{"href":"https:\/\/mattbick.dev\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=86"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mattbick.dev\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=86"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mattbick.dev\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=86"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}