围绕链表构建的动态队列比静态队列更直观。一个动态队列将作为一个空链表开始。在第一次入队操作中,增加了一个结点,并且 front 和 rear 指针均指向它。随着每个新项目被添加到队列中,新的结点被添加到链表的后面,并且 rear 指针被更新以指向新结点。
当有项目要出队时,使 front 指向链表中的下一个结点,然后删除先前 front 所指向的结点。 图 1 显示了一个动态队列的结构。
动态整数队列类 DynIntQueue 的代码清单如下所示:
//DynIntQueue.h
class DynIntQueue
{
struct QueueNode
{
int value;
QueueNode *next;
QueueNode(int value1, QueueNode *next1 = nullptr)
{
value = value1;
next = next1;
}
};
// These track the front and rear of the queue
QueueNode *front;
QueueNode *rear;
public:
// Constructor and Destructor
DynIntQueue();
~DynIntQueue();
// Member functions
void enqueue(int);
void dequeue(int &);
bool isEmpty() const;
void clear();
};
//DynIntQueue.cpp
#include <iostream>
#include "DynIntQueue.h"
#include <cstdlib>
using namespace std;
DynIntQueue::DynIntQueue()
{
front = nullptr;
rear = nullptr;
}
DynIntQueue::~DynIntQueue()
{
QueueNode * garbage = front;
while (garbage != nullptr)
{
front = front->next;
garbage->next = nullptr;
delete garbage;
garbage = front;
}
}
void DynIntQueue::enqueue(int num)
{
if (isEmpty())
{
front = new QueueNode(num);
rear = front;
}
else
{
rear->next = new QueueNode(num);
rear = rear->next;
}
}
void DynIntQueue::dequeue(int &num)
{
QueueNode *temp = nullptr;
if (isEmpty())
{
cout << "The queue is empty.\n";
exit(1);
}
else
{
num = front->value;
temp = front;
front = front->next;
delete temp;
}
}
bool DynIntQueue::isEmpty() const
{
if (front == nullptr)
return true;
else
return false;
}
void DynIntQueue::clear()
{
int value; // Dummy variable for dequeue
while (!isEmpty())
dequeue(value);
}
下面的程序是一个驱动模块程序,它演示了 DynIntQueue 类的使用:
// This program demonstrates the DynIntQueue class
#include <iostream>
#include "DynIntQueue.h"
using namespace std;
int main()
{
DynIntQueue iQueue;
cout << "Enqueuing 5 items...\n";
// Enqueue 5 items
for (int k = 1; k <= 5; k++)
iQueue.enqueue(k*k);
// Deqeue and retrieve all items in the queue
cout << "The values in the queue were: \n";
while (!iQueue.isEmpty())
{
int value;
iQueue.dequeue(value);
cout << value << " ";
}
return 0;
}
程序输出结果: