我正在尝试使用c ++中的链接列表创建堆栈。但我写的显示功能只打印堆栈的顶部。我真的不明白为什么会这样。非常感谢任何帮助或澄清。感谢
#include<iostream.h>
#include<conio.h>
class Node
{
protected:
Node* next;
int data;
public:
Node(int d){data=d;}
friend class Stack;
};
class Stack
{
public:
Stack(){top->next='\0';length=0;}
void push(int d)
{
Node *n=new Node(top->data);
n->next='\0';
top->next=n;
top->data=d;
length++;
}
int pop()
{
top=top->next;
length--;
return top->data;
}
void displaystack()
{
while(top->next!='\0')
{
cout<<top->data<<endl;
top=top->next;
}
}
int getlength()
{
return length;
}
private:
Node *top;
int length;
};
void main()
{
clrscr();
Stack s;
s.push(9);
s.push(8);
s.push(7);
s.push(6);
s.push(5);
s.push(3);
s.displaystack();
int len=s.getlength();
cout<<"length of stack is "<<len<<endl;
getch();
}
它只打印以下内容: 3 堆栈的长度是6
-------- XXXXXXX ------- -------- XXXXXXXX XXXXXXX ----------- --------- XXXXXXXXXXXXX -----
编辑代码后如下所示: 并且也有效! (感谢@Kaathe):P
#include<iostream.h>
#include<conio.h>
class Node
{
protected:
Node* next;
int data;
public:
Node(int d){data=d;}
friend class Stack;
};
class Stack
{
public:
Stack(){top->next=NULL;length=0;}
~Stack()
{
while(top!=NULL)
{
Node* toDelete=top;
top=top->next;
delete toDelete;
}
}
void push(int d)
{
Node *n=new Node(d);
n->next=top;
top=n;
length++;
}
int pop()
{
Node* oldtop=top;
top=top->next;
int oldtopdata=oldtop->data;
delete(oldtop);
--length;
return oldtopdata;
}
void displaystack()
{
Node* current=top;
while(current->next!=NULL)
{
cout<<current->data<<endl;
current=current->next;
}
}
int getlength()
{
return length;
}
private:
Node *top;
int length;
};
答案 0 :(得分:2)
当您push
时,您想要创建一个全新的Node
,请将其数据设置为值d
,并将其指向堆栈的旧顶部。然后,您可以将堆栈顶部设置为此新节点。实际上你根本不需要修改旧的顶级节点。
所以推文可以读:
void push(int d)
{
Node* newTop = new Node(d);
newTop->next = top;
top = newTop;
++length;
}
我刚刚注意到pop
也不会按预期运行,因为你丢弃顶部节点,并返回它下面的节点中的数据。也许你可以写:
int pop()
{
Node* oldTop = top;
top = top->next;
int oldTopData = oldTop->data;
delete(oldTop);
--length;
return oldTopData;
}
阻止人们弹出空堆栈可能也是个好主意(例如,在length >= 1
开头检查pop()
。
最后,displaystack
会通过丢失指向顶部节点的指针来破坏Stack
对象。也许这会更好:
void displayStack()
{
Node* currNode = top;
while(currNode->next != nullptr)
{
std::cout << currNode->data << std::endl;
currNode = currNode->next;
}
}
使用nullptr
结束链接列表对我来说更有意义。
此外,堆栈应该有一个析构函数delete
所有Node
s - 我会让你写那个;)
答案 1 :(得分:0)
当您打印(在displaystack
中)时,您应该使用临时变量而不是破坏性地更新顶部变量。
为避免pop()
中的内存泄漏,您还应delete
先前使用new
分配的节点。
答案 2 :(得分:0)
如果您的代码中仍然包含此代码,我会感到惊讶:
Stack(){top->next=NULL;length=0;}
解决方案留给读者练习;-)
答案 3 :(得分:0)
您可以将while(top->next!='\0')
替换为while(top!='\0')
它应该工作...