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;
}