Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Please implement a doubly-linked circular queue of integers. Objectives (1) mani

ID: 3545479 • Letter: P

Question

Please implement a doubly-linked circular queue of integers.


Objectives

(1) manipulate pointers, (2) allocate memory dynamically, (3) implement a default constructor, copy constructor and destructor, (4) use only one pointer to add (enqueue) an item to the back of a queue and to remove (dequeue) an item from the front of the queue.



Consider the following class declarations when implementing CQUEUE.

------   "cqueue.h" and "cqueue.cpp", respectively. -----------

Use the following driver called "cqueue_driver.cpp" to test your code:

#inlcude <iostream>
#include "cqueue.h"

using namespace std;

int main( )
{
CQUEUE k;

k.Enqueue(60);
k.Print();
k.Enqueue(20);
k.Enqueue(30);
k.Print();
k.Enqueue(10);
k.Print();
k.Enqueue(50);
k.Enqueue(40);
k.Print();

CQUEUE j = k;

j.Dequeue();
j.Print();
j.Dequeue();
j.Dequeue();
j.Dequeue();
j.Print();
j.Dequeue();
j.Dequeue();
j.Print();
j.Dequeue();
j.Dequeue();

return 0;
}

Explanation / Answer

//cqueue.h

#ifndef CQUEUE_H
#define CQUEUE_H

class qnode
{
public:
    int item;
    qnode *prev, *next;
};

class CQUEUE
{
public:
    CQUEUE( );
    ~CQUEUE( );
    CQUEUE(const CQUEUE &);
    void Enqueue(int);
    void Dequeue( );
    void Print( );
private:
    qnode *front;
};

#endif // CQUEUE_H




//cqueue.cpp

#include "cqueue.h"
#include <iostream>
using namespace std;

CQUEUE::CQUEUE(): front(NULL)
{
}

CQUEUE::CQUEUE(const CQUEUE &other): front(NULL)
{
    if (!other.front) return;

    front = new qnode;
    front->item = other.front->item;
    front->next = front->prev = front;

    const qnode *ptr1 = other.front->next;

    while (ptr1 != other.front)
    {
        qnode *pnew = new qnode;
        pnew->item = ptr1->item;
        pnew->next = front;
        pnew->prev = front->prev;
        front->prev->next = pnew;
        front->prev = pnew;
        ptr1 = ptr1->next;
    }
}

CQUEUE::~CQUEUE()
{
    if (!front) return;
    qnode *ptr = front->next;
    while (ptr != front)
    {
        qnode *toDelete = ptr;
        ptr = ptr->next;
        delete toDelete;
    }
    delete front;
}

void CQUEUE::Enqueue(int n)
{
    if (!front)
    {
        front = new qnode;
        front->item = n;
        front->next = front->prev = front;
    }
    else
    {
        qnode *pnew = new qnode;
        pnew->item = n;
        pnew->next = front;
        pnew->prev = front->prev;
        front->prev->next = pnew;
        front->prev = pnew;
    }
}

void CQUEUE::Dequeue( )
{
    if (!front) return;
    if (front->next == front) { delete front; front = NULL; return; }
    qnode *toDelete = front;
    front = front->next;
    front->prev = toDelete->prev;
    toDelete->prev->next = front;
    delete toDelete;
}

void CQUEUE::Print( )
{
    if (!front) { cout << "(empty)" << endl; return; }
    cout << front->item << " ";
    qnode *ptr = front->next;
    while (ptr != front)
    {
        cout << ptr->item << " ";
        ptr = ptr->next;
    }
    cout << endl;
}