gpt4 book ai didi

c++ - 我的一份列表拷贝的尺寸在我的堆栈中打印不正确

转载 作者:太空宇宙 更新时间:2023-11-04 11:39:58 26 4
gpt4 key购买 nike

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

enter image description here

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

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;

编辑:

初始化 num_items = 0; 后,我将在下面显示代码

        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)
{
num_items = 0;
if(num_items != MAX_SIZE)
{
newP->link = new Node;
newP = newP->link;
newP->data = curr->data;
num_items++;
}
}
}
}

我得到的尺寸输出结果为 1,我将在图像中再次显示整个输出:

enter image description here

第二次编辑:

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

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

有了这个,虽然我的大小最多只能计数到 9 而不是 10,我想是因为我的循环跳过了 0 或“NULL”,但必须有一种方法让它停止这样做。

最佳答案

最好复制单个列表,同时维护一个 Node** 存储指向需要设置为下一个 Node* 的变量:

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

关于c++ - 我的一份列表拷贝的尺寸在我的堆栈中打印不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21748645/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com