C++ 我的一个列表副本的大小在堆栈中打印不正确

C++ 我的一个列表副本的大小在堆栈中打印不正确,c++,linked-list,stack,C++,Linked List,Stack,首先,此列表的最大大小为30,每个创建的列表中的项目数存储在num_items中,它通过我在其他地方使用的push和pop方法递增和递减,但我想知道是否需要在此处跟踪num_项目。我将显示我期望的输出以及我得到的输出: 现在,我将显示复制堆栈的代码: void operator=(const Stack& s) { if (s.top == NULL) top = NULL; else {

首先,此列表的最大大小为30,每个创建的列表中的项目数存储在num_items中,它通过我在其他地方使用的push和pop方法递增和递减,但我想知道是否需要在此处跟踪num_项目。我将显示我期望的输出以及我得到的输出:

现在,我将显示复制堆栈的代码:

void operator=(const Stack& s)
    {
        if (s.top == NULL)
            top = NULL;
        else
        {
            top = new Node;
            top->data = s.top->data;
            Node* newP = top;

                for(Node* curr = s.top->link; curr != NULL; curr = curr->link)
                {
                    if(num_items != MAX_SIZE)
                    {
                    newP->link = new Node;
                    newP = newP->link;
                    newP->data = curr->data;
                    }
                }
        }
    }
提供输出的代码是:

Stack<int> s2(s1); // s2 declared as a copy of s1
    cout << "*declare s2 as a copy of s1 (stack s2(s1))\ns2=" << s2 << endl;
    cout << "s2.Size()=" << s2.Size() << endl;
    cout << "s2.IsEmpty()=" << ((s2.IsEmpty()) ? "T" : "F") << endl;
    cout << "s2.IsFull()=" << ((s2.IsFull()) ? "T" : "F") << endl;
    cout << "s2.Peek()=" << s2.Peek() << endl;
    cout << endl;
我得到的大小输出结果是1,我将在图像中再次显示整个输出:

第二次编辑:

我现在已将代码修改为以下内容:

void operator=(const Stack& s)
    {
        if (s.top == NULL)
            top = NULL;
        else
        {
            top = new Node;
            top->data = s.top->data;
            Node* newP = top;
                num_items = 0;
                for(Node* curr = s.top->link; curr = NULL; curr = curr->link)

                {

                    if(num_items != MAX_SIZE)
                    cout<< num_items;
                    {
                    newP->link = new Node;
                    newP = newP->link;
                    newP->data = curr->data;
                    ++num_items;
                    }
                }
        }
    }
void运算符=(常量堆栈&s)
{
如果(s.top==NULL)
top=NULL;
其他的
{
top=新节点;
top->data=s.top->data;
节点*newP=top;
num_items=0;
对于(节点*curr=s.top->link;curr=NULL;curr=curr->link)
{
如果(项目数!=最大大小)
coutlink=新节点;
newP=newP->link;
新建->数据=当前->数据;
++项目数量;
}
}
}
}

虽然我的大小只有9而不是10,但我认为这是因为我的循环跳过了0或“NULL”,但必须有一种方法使它停止这样做。

最好复制一个列表,同时保持一个节点**存储,指向需要设置到下一个节点的变量*:

Stack<int> s2(s1);
void operator=( const Stack& rhs ){ // or return Stack&
  // call this->clear() to avoid memory leak
  if( rhs.top == NULL ){ top = NULL; return /* *this */; }
  Node** store = &top;
  for( Node* curr = rhs.top; curr != NULL; curr = curr->link ){
    Node* newNode = new Node;
    num_items++;
    newNode->data = curr->data;
    *store = newNode;
    store = &newNode->link;
  }
  return /* *this */;
}
除非小心删除任何现有条目,否则此赋值运算符将产生内存泄漏。也许已经有一个clear()方法了

稍后: 可以使用以下构造函数:

Stack() : num_items(0), top(NULL) {}
Stack( const Stack& other ) {
  *this = other;
}
在下列情况下,应使用此明确方法:

void clear(){
  Node* curr = top;
  while( curr != NULL ){
    Node* next = curr->link;
    delete curr;
    curr = next;
  }
}

首先,谢谢你提出一个详细的问题。不幸的是,我们缺少一个关键组件:
Stack
Node
的属性是什么?它们的构造函数是什么样子的(如果有的话)?我猜:您忘记在复制构造函数(或
运算符=
)中初始化copy
num\u项,因此它以一个随机值开始。如果您执行
堆栈s2(s1)
堆栈s2=s1
,则调用的是复制构造函数,而不是运算符=。当您执行
堆栈s2。。。。。。。。。;s2=s1,您正在调用运算符=。@MatthieuM。我对它进行了一点编辑,将num_项的初始化包含在
操作符=
中,但当复制其他元素时,它不会继续递增,堆栈是我的类,它的构造函数看起来像
堆栈(const Stack&s){*this=s;}
至于节点,我相信它只是一个指针,但是我觉得我可能错了。@BreonThibodeaux:注意:在
for
循环的每一个回合中,您都会将
num_items
重置为
0
,因为它在内部而不是外部。@BreonThibodeaux:您知道吗?这些是在线编译器。您可以将语言设置为C++,并创建一个最小的示例,然后编译并运行它。如果您可以在那里重现您的问题,然后提供一个指向失败程序的链接,这样我们就有机会查看并调整它,那将是非常棒的。您可以使用*this=other实现复制构造函数,将代码保留在原处,从而保留operator=。此代码适用于我的第三个副本!它返回的大小为10,但对于我的第二个副本,它返回的大小为300k+,我不太确定这个数字是如何产生的检查您的构造函数-它应该将num_items设置为0。或者确实调用clear()。关于这一点,我对这个方法的签名必须是
void operator=(const Stack&s)
,这让我很困惑,如果这个
Stack(){top=NULL;curr=NULL;num_items=0;}Stack(const Stack&s){*this=s;}
是清晰的话,这些是我现在使用的构造函数,很多人不认为第二个是构造函数,但这就是课堂上教给我的方法。operator=应该遵循作为返回LHS的表达式的一般模式(最小意外原则)。无论哪种方式,构造函数都可以。现在一切都好了吗?
Stack() : num_items(0), top(NULL) {}
Stack( const Stack& other ) {
  *this = other;
}
void clear(){
  Node* curr = top;
  while( curr != NULL ){
    Node* next = curr->link;
    delete curr;
    curr = next;
  }
}