我在3个文件“Source.cpp,Queue.h,Queue.cpp”中编写了代码。
每次运行程序时,都显示错误,我不知道原因。包括所有需要的库。
// Source.Cpp“主要功能”
Queue<int>X;
//trying to run the program .
for ( int i = 0; i < 5; i++)
{
X.Push(i + 1);
cout << X.Size() << endl;
}
X.front();/
X.Pop();
X.front();
X.Pop();
return 0;
// Queue.h
//节点类.header文件,包含所有函数。
template<class Mine>
class Node
{
public:
Mine Value;
Node<Mine> *Prev;
Node();
Node(Mine );
};
template<class Mine>
//Queue Class
class Queue
{
int Elements;
Node<Mine> *Front, *Back;
public:
Queue();
~Queue();
int Size();//returns Queue Size
void Push(Mine );//Push a new value to the back
void Pop();//removes a value from the front
void Clear();// delete all the elements
bool isEmpty();// checks if there are no elements in the queue
Mine front();//returns the value in the front
};
// Queue.cpp
//实现。我写的代码。
template<class Mine>
Node<Mine>::Node()
{
Value = 0;
Prev = 0;
}
template<class Mine>
Node<Mine>::Node(Mine Value)
{
this->Value = Value;
Prev = 0;
}
template<class Mine>
Queue<Mine>::Queue()
{
Elements = 0;
Front = Back = 0;
}
template<class Mine>
Queue<Mine>::~Queue()
{
Clear();
}
template<class Mine>
int Queue<Mine>::Size()
{
return Elements;
}
template<class Mine>
void Queue<Mine>::Push(Mine Value)
{
Node<Mine> *NEW = new Node<Mine>(Value);
if (Front==0)
{
Front = Back = NEW;
Back->Prev = 0;
}
else
{
Back->Prev=NEW;
Back = NEW;
Back->Prev = 0;
}
Elements++;
}
template<class Mine>
void Queue<Mine>::Pop()
{
Node<T>*tmp;
assert(!isEmpty());
tmp = Front->Prev;
delete Front;
Front = tmp;
delete tmp;
if ( Elements==1)Front=Back;
Elements--;
}
template<class Mine>
void Queue<Mine>::Clear()
{
for (int i = 0; i < Elements; i++)
{
Pop();
}
}
template<class Mine>
bool Queue<Mine>::isEmpty()
{
return Elements == 0;
}
template<class Mine>
Mine Queue<Mine>::front()
{
assert(!isEmpty());
return Front->Value;
}
每当我尝试运行该程序时,它就会停止工作。
答案 0 :(得分:1)
成员函数Pop
错误。对于初学者,它会立即删除队列中的两个节点
delete Front;
Front = tmp;
delete tmp;
并且在调用Back
后结果队列为空时,它不会将Pop
设置为0.。
该功能可以按以下方式查看
template<class Mine>
void Queue<Mine>::Pop()
{
assert(!isEmpty());
Node<T> *tmp = Front->Prev;
delete Front;
Front = tmp;
if ( --Elements == 0 ) Back = nullptr;
}
也是这样的陈述
Back->Prev = 0;
在成员函数Push
中是多余的,因为该数据成员已在节点的构造函数中设置为0.
从设计的角度来看,类Node
应该是类Queue
的内部私有结构,因为它是类Queue
的实现细节。
将数据成员Prev
重命名为Next
会更符合逻辑。