将队列项目复制到另一个类对象中

Copy queue items into another class object

本文关键字:对象 另一个 队列 项目 复制      更新时间:2023-10-16

当我在队列中显示项目时,我使用while循环

while (!queue.isEmptyQueue())
{
    cout << queue.front() << " ";
    queue.deleteQueue();
}

由于deleteQueue()功能的原因,这些项目将消失,因此我无法再次显示它。如何创建队列的副本?

我尝试了下面的代码,但它给了我错误。

queue1 = queue;
while (!queue1.isEmptyQueue())
{
    cout << queue1.front() << " ";
    queue1.deleteQueue();
}

我正在使用linkedQueue.h

#include<assert.h>
template <class Type>
struct nodeType
{
    Type info;
    nodeType<Type> *link;
};
template <class Type>
class linkedQueueType  //: public queueADT<Type>
{
    public:
        const linkedQueueType<Type>& operator=(const         linkedQueueType<Type>&);
        bool isEmptyQueue() const;
        bool isFullQueue() const;
        void initializeQueue();
        Type front() const;
        Type back() const;
        void addQueue(const Type& queueElement);
        void deleteQueue();
        linkedQueueType();
        linkedQueueType(const linkedQueueType<Type>& otherQueue);
        ~linkedQueueType();
    private:
        nodeType<Type> *queueFront; 
        nodeType<Type> *queueRear; 
};
template <class Type>
bool linkedQueueType<Type>::isEmptyQueue() const
{
    return(queueFront == NULL);
}
template <class Type>
bool linkedQueueType<Type>::isFullQueue() const
{
    return false;
} 
template <class Type>
void linkedQueueType<Type>::initializeQueue()
{
    nodeType<Type> *temp;
    while (queueFront!= NULL) 
    {
        temp = queueFront; 
        queueFront = queueFront->link; 
        delete temp; 
    }
    queueRear = NULL; 
} 
template <class Type>
void linkedQueueType<Type>::addQueue(const Type& newElement)
{
    nodeType<Type> *newNode;
    newNode = new nodeType<Type>; 
    newNode->info = newElement; 
    newNode->link = NULL; 
    if (queueFront == NULL) 
    {
        queueFront = newNode;
        queueRear = newNode;
    }
    else 
    {
        queueRear->link = newNode;
        queueRear = queueRear->link;
    }
}
template <class Type>
Type linkedQueueType<Type>::front() const
{
    assert(queueFront != NULL);
    return queueFront->info;
} 
template <class Type>
Type linkedQueueType<Type>::back() const
{
    assert(queueRear!= NULL);
    return queueRear->info;
} 
template <class Type>
void linkedQueueType<Type>::deleteQueue()
{
    nodeType<Type> *temp;
    if (!isEmptyQueue())
    {
    temp = queueFront; 
    queueFront = queueFront->link; 
    delete temp; 
    if (queueFront == NULL) 
    queueRear = NULL; 
    }
    else
    cout << "Cannot remove from an empty queue" << endl;
}
template<class Type>
linkedQueueType<Type>::linkedQueueType()
{
    queueFront = NULL; 
    queueRear = NULL; 
} 
template <class Type>
linkedQueueType<Type>::~linkedQueueType()
{
    initializeQueue();
}

如果你想复制队列,那么正如Martin所说,复制构造函数/赋值运算符就是你应该拥有的。

但是,如果您希望项目在经过队列后仍然存在,那么您的队列缺少的是一种方法来判断队列中有多少项目。

您可以定制每个项目,然后将其移动到队列的后面,次数就是这样。

无论哪种方式,都缺少所有这些,使其成为一个好的队列实现。复制构造函数、赋值运算符、大小函数。

(从技术上讲,队列没有访问后台项的功能。所以我不会称之为缺少功能的队列,我会称之为丢失功能的链表。)

您的问题是linkedQueueType没有赋值运算符,因此编译器会给您一个只复制指针的运算符。您需要一个用于克隆元素的赋值运算符。

相关文章: