到目前为止,我一直在问这个相同代码的很多问题,但这绝对是最后一个错误,我这次要求的只是指导,看看我是否正在修正它。我将展示我得到的输出:
我将再次展示我期待收到的输出
现在我认为发生了什么,当s2设置为0时,我相信s1 = s1 + s2
部分没有认识到s2是空的,因为它从0开始?但总的来说,s2堆栈应该是空的,我真的不明白它是如何设置为NULL的。
我将展示将我的列表添加到一起的功能:
Stack operator+(const Stack& s) const
{
// copy the first list
Stack t = *this;
Stack u = *this;
Node *n = s.top;
// iterate through the second list and copy each element to the new list
while (n != NULL && !t.IsFull())
{
t.Push(n->data);
n = n->link;
}
n = t.top;
while(n != NULL && !t.IsEmpty())
{
u.Push(n->data);
t.Pop();
n = t.top;
}
return u;
}
在上面的代码中,我尝试返回t而导致*s1 = s1 + s2
为NULL,因此我认为问题可能出现在此代码或之前的代码中,我还会显示operator=
功能如下:
void operator=(const Stack& s)
{
if (s.top == NULL){
num_items = 0;
top = NULL;}
else
{
top = new Node;
top->data = s.top->data;
Node* newP = top;
num_items = 1;
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;
++num_items;
}
}
}
}
编辑:我发布了下面的整个程序,希望它能解决问题
答案 0 :(得分:0)
问题不在s2
,问题出在operator+
。让我们在运算符中放入一些cout
语句,看看发生了什么:
Stack operator+(const Stack& s) const
{
// copy the first list
Stack t = *this;
Stack u = *this;
Node *n = s.top;
// iterate through the second list and copy each element to the new list
while (n != NULL && !t.IsFull())
{
t.Push(n->data);
n = n->link;
}
cout << "end of first while loop, t is " << t << endl;
cout << "entering second while loop, u is " << u << endl;
n = t.top;
while(n != NULL && !t.IsEmpty())
{
u.Push(n->data);
t.Pop();
n = t.top;
}
cout << "end of second while loop, u is " << u << endl;
return u;
}
假设*this
为{1 2 3}且s
为{4 5 6}。人们可能希望“添加它们会导致{1 2 3 4 5 6},但练习的结果是:
end of first while loop, t is 6 5 4 1 2 3
entering second while loop, u is 1 2 3
end of second while loop, u is 3 2 1 4 5 6 1 2 3
在第一个循环结束时,所有元素都在t中,但顺序错误,并且不清楚如何重新排列它们。在第二轮循环结束时,事情显然已经脱轨了。