我有大学作业。通常堆栈使用线性链表,但他们要求我们使用双链表来制作堆栈。基本上,不是从头开始弹出元素,而是从头开始弹出。现在,这是我编写的代码。它的工作原理,并给我准确的结果。如果我像2,3和4一样推入,然后弹出一个,cout显示3,但是我在节点类的setnext或setprev中也得到了空指针异常,我似乎找不到问题。我尝试了不同的if语句,但是什么也没有。
class DNode
{
public:
int Get() { return Object; }
void Set(int Object) { this->Object = Object; }
DNode* GetNext() { return NextNode; }
void SetNext(DNode* NextNode) { this->NextNode = NextNode; }
DNode* GetPrev() { return PrevNode; }
void SetPrev(DNode* PrevNode) { this->PrevNode = PrevNode; }
private:
int Object;
DNode* PrevNode;
DNode* NextNode;
};
class Stack
{
public:
Stack()
{
HeadNode = nullptr;
Size = 0;
}
~Stack()
{
while (Size > 0)
{
Pop();
}
}
void Push(int AddObject)
{
DNode* NewNode = new DNode();
NewNode->Set(AddObject);
if (HeadNode == nullptr)
{
HeadNode = NewNode;
HeadNode->SetPrev(nullptr);
HeadNode->SetNext(nullptr);
}
else
{
HeadNode->SetNext(NewNode);
NewNode->SetPrev(HeadNode);
NewNode->SetNext(nullptr);
HeadNode = NewNode;
}
Size++;
}
int Pop()
{
if (Size == 1)
{
return HeadNode->Get();
delete HeadNode;
HeadNode == nullptr;
}
else if (Size > 1)
{
DNode* TempPtr = HeadNode;
HeadNode = HeadNode->GetPrev();
HeadNode->SetNext(nullptr);
return TempPtr->Get();
delete TempPtr;
}
Size--;
}
int Top()
{
if (HeadNode != nullptr)
{
return HeadNode->Get();
}
return 0;
}
bool IsEmpty()
{
if (Size == 0)
{
return true;
}
else if(Size > 0)
{
return false;
}
}
private:
DNode* HeadNode;
int Size;
};